使用 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


噜噜哒
浏览 219回答 1
1回答

偶然的你

问题arr是一个指针切片 ( *C.struct_FileInfo)。&arr[0]获取该切片的第一个元素的(指向)地址。变量的ai地址成为 的第一个元素arr,由 Go 分配。因此:arr[0]contains ,它是Go 分配&ai的指针。C.struct_FileInfoarr也由 Go 管理,因此&arr[0]是“指向 Go 指针的 Go 指针”。请仔细阅读此内容。可能的解决方案一种解决方案是调用C.malloc分配足够的字节来存储C.struct_FileInfo. 这样,您将拥有指向 C 指针的 Go 指针 (&arr[0]),这很好。完成记忆后不要忘记C.free它。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go