ホームページ  >  記事  >  バックエンド開発  >  cgo を使用して Go で C Char 配列に安全にアクセスする方法は?

cgo を使用して Go で C Char 配列に安全にアクセスする方法は?

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 Char 配列にアクセスする

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 Char 配列に安全にアクセスする方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。