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

2 回复

你不需要将 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)
}

关键点:

  1. C.CString() 返回的是 *_Ctype_char 类型,可以直接传递给需要 const char* 参数的 C 函数
  2. 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函数,同时确保内存被正确释放。

回到顶部