我正在尝试在 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 关注
- 218 浏览
添加回答
举报
0/150
提交
取消