首頁  >  文章  >  後端開發  >  如何使用 cgo 安全地存取 Go 中的 C 字元陣列?

如何使用 cgo 安全地存取 Go 中的 C 字元陣列?

Linda Hamilton
Linda Hamilton原創
2024-11-18 07:12:02739瀏覽

How to Safely Access a C Char Array in Go using cgo?

使用cgo 存取Go 中的C 字元陣列

在C 中,我們經常遇到常數字元指標數組(例如const char * myStringArray [])。使用 cgo 從 Go 存取此類陣列可能具有挑戰性。

不正確的方法:

最初,您可能會嘗試使用不安全的指針算術直接索引數組:

myGoString := C.GoString((*C.char) (unsafe.Pointer(uintptr(unsafe.Pointer(C.myStringArray)) + uintptr(index) * unsafe.Sizeof(C.myStringArray))))

但是,這種方法將導航字串中的字符,而不是數組

正確解決方案:

更可靠的解決方案是將C 數組轉換為Go 切片。

// Define array size
arraySize := 3

// Create Go slice
cStrings := (*[1 << 30]*C.char)(unsafe.Pointer(&C.myStringArray))[:arraySize:arraySize]

// Iterate over slice
for _, cString := range cStrings {
    fmt.Println(C.GoString(cString))
}

這種方法可確保正確的解決方案陣列的索引,提供對每個字串元素的完整存取。

透過理解指標操作的複雜性和Go 切片的實用性,可以有效彌合 C 和 Go 記憶體結構之間的差距。

以上是如何使用 cgo 安全地存取 Go 中的 C 字元陣列?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn