【Go】CStringでキャストした文字列の終端にNULL文字が付くのか確認してみた
こんばんは、白米のおともです。
C言語の文字列操作関数は、文字列終端にNULL文字が有ることを前提としています。
しかし、Goではstring型のゼロ値は空文字""であり、そもそもNULL文字というものが存在するのか謎です。
そこでcgoで文字列を扱う際に、Goから渡される文字列終端にはNULL文字が入っているのか気になったので、GoでキャストしたCString型の文字列の終端にNULL文字が付くのかどうかを確認してみました。
ソースコード
Go側で作った文字列変数を、CStringでキャストしC側に渡します。
C側で文字列の終端をチェックし、結果を出力するようにしました。
package main import ( "unsafe" ) // #include <stdio.h> // #include <string.h> // #include <stdlib.h> // // void nullCheck(char *str) { // if (str[strlen(str) + 1] == '\0') { // printf("Terminating character is NULL.\n"); // return; // } // printf("Terminating character is not NULL.\n"); // } import "C" func main() { s := "aiueo" cs := C.CString(s) C.nullCheck(cs) C.free(unsafe.Pointer(cs)) }
結果
終端文字はNULLである事が確認できました。
$ go run nullCheck.go Terminating character is NULL.
まとめ
Goから渡された文字列をC側で処理する際に、終端にNULLがないと意図しない動作を起こしかねないので、文字列終端がNULL文字であるのかどうかを確認しました。
結果はGoから渡された文字列の終端にはNULL文字が含まれていました。
これで安心してcgoで文字列が扱えそうです。
最初C.freeが無いと言われていたのですが、stdlib.hをincludeしていないのが原因でした。
気をつけよう。。。