簡體   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