gpt4 book ai didi

返回 C.CString 时出现 CGo 段错误

转载 作者:行者123 更新时间:2023-12-02 12:04:03 26 4
gpt4 key购买 nike

我试图从 C 代码调用 Go 函数,但遇到了一个我无法真正解释的问题:

C:

char * ret; 
CheckDpkgInfo(&ret);
printf("%s", ret);

Go:

func CheckDpkgInfo(dpkg_c **C.char) { 
*dpkg_c = C.CString("whatever")
}

这可行,但当我简单地从 Go 返回一个 c 字符串(段错误)时就不行了:

C:

char * ret = CheckDpkgInfo();
printf("%s", ret);

Go:

func CheckDpkgInfo() *C.char { 
return C.CString("whatever")
}

如果我正确理解文档,CString 应该调用 malloc,因此我真的不明白为什么 printf 出现段错误。谢谢!

最佳答案

I am trying to call a Go function from C code.

您的问题到底是什么?

<小时/>

例如,这有效,

输出:

$ 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;
}
<小时/>

引用:Command cgo

<小时/>

解决方案:

评论:即使是最小的示例也会导致段错误,但这是因为我在 Docker 容器中构建应用程序,同时在外部准备 c 存档。所以这归结为兼容性问题。 –gbatt

关于返回 C.CString 时出现 CGo 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58187124/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com