【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していないのが原因でした。
気をつけよう。。。