引
有时候为节约内存用了 C.CBytes 函数,这不往坑里跑了。c 里面字符串都是要以数字 0 结尾的。
复现代码(直接使用 C.CBytes 有问题)
为节约内存,想使用 C.CBytes 直接到 c 的 char *类型。但是有问题
package main
// #include <string.h>
import "C"
import (
"fmt"
)
func main() {
b := []byte("我是小妖怪,逍遥又自在,杀人不眨眼,吃人不放盐。")
bs := string(b)
p := C.CBytes(b)
fmt.Printf("%d:%d:%d\n", int(C.strlen((*C.char)(p))), len(b), int(C.strlen((*C.char)(C.CString(bs)))))
}
// 输出
// Cbytes.strlen(75): len(72):CString.strlen(72)
发现长度不对
改进方法([]byte 到*C.char)
既然 C.Bytes 这条路走不同,换个思路,用类型强转吧 []byte->string。再使用 C.CString 不就得了
// #include <string.h>
import "C"
import (
"fmt"
"unsafe"
)
func main() {
b := []byte("我是小妖怪,逍遥又自在,杀人不眨眼,吃人不放盐。")
bs := *(*string)(unsafe.Pointer(&b))
p := C.CString(bs)
fmt.Printf("strlen(%d)\n", C.strlen((*C.char)(p)))
}