將切片指標傳遞給 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中文網其他相關文章!