[英]Translate a Go nested array of struct to C using CGO?
我正在嘗試在 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
錯誤的panic: runtime error: cgo argument has Go pointer to Go pointer
。
如何修復此錯誤?
工作游樂場網址: https : //play.golang.org/p/vpLddEyY8kI
arr
是一片指針( *C.struct_FileInfo
)。&arr[0]
獲取(指向)該切片第一個元素的地址。ai
變量,其地址成為arr
的第一個元素,由 Go 分配。因此:
arr[0]
包含&ai
,它是一個指向由 Go 分配的C.struct_FileInfo
的指針。arr
也由 Go 管理,因此&arr[0]
是“指向 Go 指針的 Go 指針”。請仔細閱讀本文。
一種解決方案是調用C.malloc
分配足夠的字節來存儲C.struct_FileInfo
。 這樣,您將擁有指向 C 指針的 Go 指針 (&arr[0]),這很好。
完成該內存后,不要忘記將其C.free
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.