[英]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.