ホームページ >バックエンド開発 >Golang >CGO を使用して Go 文字列を C char* ポインターに安全にコピーするにはどうすればよいですか?

CGO を使用して Go 文字列を C char* ポインターに安全にコピーするにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-01 12:17:15518ブラウズ

How to Safely Copy Go Strings to C char* Pointers using CGO?

CGO を使用して Go 文字列を C char* ポインターにコピーする

Go の領域では、シームレスに交換する必要がある状況に遭遇することがあります。 Go コードと C ライブラリまたはアプリケーション間のデータ。そのようなシナリオの 1 つは、CGO の機能を使用して Go 文字列を C 文字ポインター (char *) に転送することです。

課題:

Go をコピーしたいという欲求が生じます。 CGO の魔法の機能を使用して、文字列を char * に変換します。疑問は残ります: これは次のアプローチを使用して達成できますか?

func copy_string(cstr *C.char) {
    str := "foo"
    C.GoString(cstr) = str
}

解決策:

意図は崇高ですが、コード スニペットで示されているアプローチは当てはまりません。短い。 CGO の公式ドキュメントによると、Go 文字列を C 文字列に変換する正しい方法には、C.CString 関数を利用することが含まれます。

cstr = C.CString(str)

C.CString は強制的にメモリを割り当てることに留意することが重要です。あなた。ただし、この記憶は自動的に解放されるわけではなく、ユーザーの勤勉な努力に委ねられます。この状況を修正するには、C.free:

C.free(unsafe.Pointer(cstr))

を明示的に呼び出して、割り当てられたメモリを手動で解放する必要があります。このアプローチを採用することで、割り当てられたメモリが適切に破棄され、メモリ リークが発生することを回避できます。そうしないと、コードに問題が発生します。

以上がCGO を使用して Go 文字列を C char* ポインターに安全にコピーするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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