gpt4 book ai didi

c - 使用CGO将Go嵌套结构的数组转换为C?

转载 作者:行者123 更新时间:2023-12-01 22:00:30 26 4
gpt4 key购买 nike

我正在尝试在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]采用该 slice 的第一个元素的地址(指针)。
  • 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编码。

    关于c - 使用CGO将Go嵌套结构的数组转换为C?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63827764/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com