我正在嘗試在 Go 中創建一個結構,其中一個子結構是一個結構數組,然后使用 CGO 將其轉換為 C。我在 Go 中嘗試過這樣的事情*/typedef struct FileInfo{ int64_t Size; char *Name;}FileInfo;typedef struct Result{ FileInfo **files;}Result;int64_t GetResult(void **presult, FileInfo **files) { Result *result = (Result *)malloc(sizeof(Result)); result->files=files; *presult = result; int64_t ptr = (int64_t)result; return ptr;}*/import "C"func Run() { var arr []*C.struct_FileInfo ai := C.struct_FileInfo{ Size: C.int64_t(1234), Name: C.CString("some name"), } arr = append(arr, &ai) var presult unsafe.Pointer ptr := C.GetResult(&presult, &arr[0]) println("\nResult struct pointer: %v", ptr)}它拋出了一個panic: runtime error: cgo argument has Go pointer to Go pointer錯誤。如何修復此錯誤?更新:工作游樂場網址: https: //play.golang.org/p/vpLddEyY8kI
1 回答

偶然的你
TA貢獻1841條經驗 獲得超3個贊
問題
arr
是一個指針切片 (*C.struct_FileInfo
)。&arr[0]
獲取該切片的第一個元素的(指向)地址。變量的
ai
地址成為 的第一個元素arr
,由 Go 分配。
因此:
arr[0]
contains ,它是Go 分配&ai
的指針。C.struct_FileInfo
arr
也由 Go 管理,因此&arr[0]
是“指向 Go 指針的 Go 指針”。
請仔細閱讀此內容。
可能的解決方案
一種解決方案是調用C.malloc
分配足夠的字節來存儲C.struct_FileInfo
. 這樣,您將擁有指向 C 指針的 Go 指針 (&arr[0]),這很好。
完成記憶后不要忘記C.free
它。
- 1 回答
- 0 關注
- 245 瀏覽
添加回答
舉報
0/150
提交
取消