首頁 > 後端開發 > Golang > 如何將 Go 切片傳遞給 C 函數並處理指標修改?

如何將 Go 切片傳遞給 C 函數並處理指標修改?

Barbara Streisand
發布: 2024-12-16 18:34:12
原創
955 人瀏覽過

How to Pass Go Slices to C Functions and Handle Pointer Modifications?

將切片指標傳遞給 Go 中的 C 函數

當使用 cgo 從 Go 呼叫 C 函數時,將指標傳遞給切片。考慮一個 C 函數,如:

int f(int *count, char ***strs);
登入後複製

其中 count 是 strs 陣列的長度,strs 是字串數組,傳回值指示錯誤狀態。

在 Go 中,一開始可能會嘗試如下傳遞 count 和 strs:

C.f((*C.int)(&count), (**C.char)(&strs[0]))
登入後複製

但是,這不允許在 C 中修改 strs。若要啟用此功能,有必要在 C 中指派陣列。與 C.CString 類似,必須追蹤釋放外部數組的位置,特別是當 C 函數可能分配新數組時。

下面的程式碼示範如何分配C 陣列:

cArray := C.malloc(C.size_t(c_count) * C.size_t(unsafe.Sizeof(uintptr(0))))

// Convert the C array to a Go array for indexing
a := (*[1<<30 - 1]*C.char)(cArray)
for index, value := range strs {
    a[index] = C.CString(value)
}

err := C.f(&c_count, (***C.char)(unsafe.Pointer(&cArray)))
登入後複製

在此程式碼中,cArray 在C 中分配,a 是該陣列的切片包裝器以允許索引,每個字串都複製到C 中記憶。函數 f 現在可以修改 C 中的 strs 並將修改後的值傳回 Go。

以上是如何將 Go 切片傳遞給 C 函數並處理指標修改?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板