c - 返回 C.CString 时 CGo 段错误
问题描述
我试图从 C 代码调用 Go 函数,但遇到了一个我无法真正解释的问题:
C:
char * ret;
CheckDpkgInfo(&ret);
printf("%s", ret);
去:
func CheckDpkgInfo(dpkg_c **C.char) {
*dpkg_c = C.CString("whatever")
}
这行得通,但当我简单地从 Go (segfault) 返回 ac 字符串时就不行了:
C:
char * ret = CheckDpkgInfo();
printf("%s", ret);
去:
func CheckDpkgInfo() *C.char {
return C.CString("whatever")
}
如果我正确理解了文档,CString 应该调用 malloc,因此我真的不明白为什么 printf 段错误。谢谢!
解决方案
我正在尝试从 C 代码调用 Go 函数。
你的问题到底是什么?
例如,这有效,
输出:
$ go version
go version devel +5e514b76e2 Tue Oct 1 00:02:11 2019 +0000 linux/amd64
$ gcc --version
gcc (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0
$ go build -buildmode=c-archive -o cstr.a cstr.go
$ gcc -pthread -o cstr cstr.c cstr.a
$ ./cstr
ret = 0x5600ca344390
whatever
$ echo $?
0
$
cstr.go
:
package main
/*
*/
import "C"
//export CheckDpkgInfo
func CheckDpkgInfo() *C.char {
return C.CString("whatever")
}
func main() {}
cstr.c
:
#include "cstr.h"
#include <stdlib.h>
#include <stdio.h>
int main() {
char * ret = CheckDpkgInfo();
printf("ret = %p\n", ret);
if (!ret) {
return 1;
}
printf("%s\n", ret);
free(ret);
return 0;
}
参考:命令 cgo
解决方案:
评论:即使是最小的示例也导致了段错误,但这是由于我在 Docker 容器中构建应用程序,同时在外部准备 c-archive。所以它归结为一个兼容性问题。– gbatt
推荐阅读
- python - 更新用户配置文件 - Django
- java - 使用 JAVA 查找正则表达式模式
- .net - 安装在 VM 上的 .NET Framework 控制台应用无法访问 Azure Key Vault
- java - 如何使用递归返回集合的所有大小为 k 的子集?
- python - 更改 matplotlib 图例标记中的边缘颜色
- python - 在类中存储变量的最佳 Pythonic 方法
- ruby-on-rails - 如何解决 Redmine 插件上 QueryAssociationColumn 的 NameError?
- azure - 如何从 ADF 管道调用其他资源组中的 ADF 管道?
- kubernetes - Rancher/kubernetes 轮换证书的位置
- android - 有没有办法停止在 Android 仪器测试 Kotlin (ActivityTestRule) 中启动活动