为了账号安全,请及时绑定邮箱和手机立即绑定

在 C 中使用 GoString

在 C 中使用 GoString

Go
qq_笑_17 2021-10-18 11:00:23
由于 cgo,我正在尝试在 C 程序中使用一些 Go 代码我的 Go 文件如下所示:package helloimport (    "C")//export HelloWorldfunc HelloWorld() string{    return "Hello World"}我的 C 代码是这样的:#include "_obj/_cgo_export.h"#include <stdio.h>int main (){   GoString greeting = HelloWorld();   printf("Greeting message: %s\n", greeting.p );   return 0;}但是我得到的输出不是我所期望的:问候语:我猜这是一个编码问题,但关于它的文档很少,我对 C 几乎一无所知。你知道那段代码出了什么问题吗?编辑 :正如我刚刚在下面的评论中所说:我 [...] 试图返回并仅打印一个 Go int(这是一个 C 的“long long”)并且也得到了错误的值。所以看起来我的问题不在于字符串编码或空终止,而可能在于我如何编译整个事情我很快就会添加我所有的编译步骤
查看完整描述

2 回答

?
慕丝7291255

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"

}


查看完整回答
反对 回复 2021-10-18
?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

这个评论很好地描述了我的问题:Call go functions from C

你可以从 C 中调用 Go 代码,但目前你不能将 Go 运行时嵌入到 C 应用程序中,这是一个重要但微妙的区别。

这就是我试图做的,这就是它惨遭失败的原因。

我现在正在研究新-buildmode=c-shared选项


查看完整回答
反对 回复 2021-10-18
  • 2 回答
  • 0 关注
  • 399 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信