ホームページ  >  記事  >  バックエンド開発  >  Go から `const char*` 文字列の C 配列に正しくアクセスする方法

Go から `const char*` 文字列の C 配列に正しくアクセスする方法

DDD
DDDオリジナル
2024-11-19 22:08:03910ブラウズ

How to Correctly Access a C Array of `const char*` Strings from Go?

Go から const char * の C 配列にアクセス

const char cgo を使用して Go から。具体的には、C の文字列配列があり、それにインデックスを付けて配列エントリを Go 文字列に変換したいとします。

間違ったアプローチ

現在のコードはポインター算術演算を使用してこれを実行しようとします:

myGoString := C.GoString((*C.char) (unsafe.Pointer(uintptr(unsafe.Pointer(C.myStringArray)) + uintptr(index) * unsafe.Sizeof(C.myStringArray))))
ただし、このアプローチは配列を上向きに作成するのではなく、文字列の文字に沿ってインデックスを作成するため、正しくありません。その結果、文字列全体ではなく、各文字列の最初の数文字が取得されます。

正しい解決策

C 配列に正しくアクセスするには、より安全で、最初に Go スライスに変換すると便利です:

import "unsafe"

const arraySize = 3

cStrings := (*[arraySize]*C.char)(unsafe.Pointer(&C.myStringArray))[:arraySize:arraySize]

for _, cString := range cStrings {
    fmt.Println(C.GoString(cString))
}
C 配列を Go スライスに変換すると、その要素を反復処理し、C.GoString( を使用して各要素を Go 文字列に変換できます) ).

サンプル出力

次のサンプル出力に示すように、このアプローチにより、C 配列から文字列全体が確実に取得されます。

以上がGo から `const char*` 文字列の C 配列に正しくアクセスする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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