Golang中如何将CString传递给Cgo函数
Golang中如何将CString传递给Cgo函数 以下函数出现错误:
func write_file_dll(input string) {
cStr := unsafe.Pointer(C.CString(input))
defer C.free(cStr)
C.face(cStr)
}
错误信息:cannot use cStr (type unsafe.Pointer) as type *_Ctype_char in argument to _Cfunc_face
但是当我移除 unsafe.Pointer() 后,错误变为:
cannot use cStr (type *_Ctype_char) as type unsafe.Pointer in argument to func literal
我的头文件是:
#include <stdint.h>
#include <stdlib.h>
#include <stdbool.h>
extern void face(const char *da);
它连接的是外部 so 文件
更多关于Golang中如何将CString传递给Cgo函数的实战教程也可以访问 https://www.itying.com/category-94-b0.html
你不需要将 cStr 设为 unsafe.Pointer。
尝试:
func write_file_dll(input string) {
cStr := C.CString(input)
defer C.free(unsafe.Pointer(cStr))
C.face(cStr)
}
你还需要在 C 语言端编写一个包装器来将 char* 转换为 const char*
更多关于Golang中如何将CString传递给Cgo函数的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
问题在于类型转换不正确。C.CString() 已经返回了 *_Ctype_char 类型,不需要再用 unsafe.Pointer() 包装。同时,C.free() 需要的是 unsafe.Pointer 类型。
以下是正确的代码:
func write_file_dll(input string) {
cStr := C.CString(input)
defer C.free(unsafe.Pointer(cStr))
C.face(cStr)
}
关键点:
C.CString()返回的是*_Ctype_char类型,可以直接传递给需要const char*参数的 C 函数C.free()需要unsafe.Pointer类型,所以需要在释放时进行类型转换
如果仍然遇到问题,确保在文件顶部有正确的导入:
package main
/*
#include <stdint.h>
#include <stdlib.h>
#include <stdbool.h>
extern void face(const char *da);
*/
import "C"
import "unsafe"
这样修改后,代码应该能正确编译并运行,将Go字符串传递给C函数,同时确保内存被正确释放。

