繁体   English   中英

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

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM