如何解决使用CGO将Go嵌套结构的数组转换为C?
我试图在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
解决方法
问题
-
arr
是指针(*C.struct_FileInfo
)的一部分。 -
&arr[0]
使用该切片的第一个元素的地址(指向)。 -
ai
变量的地址成为arr
的第一个元素,由Go分配。
因此:
-
arr[0]
包含&ai
,它是Go分配的C.struct_FileInfo
的指针。 -
arr
也由Go管理,因此&arr[0]
是“指向Go指针的Go指针”。
请仔细阅读this。
可能的解决方案
一种解决方案是调用C.malloc
分配足够的字节来存储C.struct_FileInfo
。这样,您将拥有指向C指针的Go指针(&arr [0])。
使用完该内存后,请不要忘记C.free
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。