2 回答
TA贡献1859条经验 获得超6个赞
printf期望以 NUL 结尾的字符串,但 Go 字符串不是以 NUL 结尾的,因此您的 C 程序表现出未定义的行为。请改为执行以下操作:
#include "_obj/_cgo_export.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
GoString greeting = HelloWorld();
char* cGreeting = malloc(greeting.n + 1);
if (!cGreeting) { /* handle allocation failure */ }
memcpy(cGreeting, greeting.p, greeting.n);
cGreeting[greeting.n] = '\0';
printf("Greeting message: %s\n", cGreeting);
free(cGreeting);
return 0;
}
或者:
#include "_obj/_cgo_export.h"
#include <stdio.h>
int main() {
GoString greeting = HelloWorld();
printf("Greeting message: ");
fwrite(greeting.p, 1, greeting.n, stdout);
printf("\n");
return 0;
}
或者,当然:
func HelloWorld() string {
return "Hello World\x00"
}
TA贡献1788条经验 获得超4个赞
这个评论很好地描述了我的问题:Call go functions from C
你可以从 C 中调用 Go 代码,但目前你不能将 Go 运行时嵌入到 C 应用程序中,这是一个重要但微妙的区别。
这就是我试图做的,这就是它惨遭失败的原因。
我现在正在研究新-buildmode=c-shared
选项
- 2 回答
- 0 关注
- 399 浏览
添加回答
举报