如何解决如何将“C”字符串从“C”例程传递给 GO 函数并将其转换为 GO 字符串?
这一定是非常愚蠢和基本的事情,但是 cgo 文档(和 google fu)让我陷入困境。这就是我想要做的:我想要一个 GO 函数使用“导入“C”来调用“C”函数。所说的“C”函数需要将“C”字符串(malloc 或常量 - 都不适合我)的地址存储到作为 *C.char 传递给它的参数中。然后 GO 函数需要将其转换为 GO 字符串。它实际上确实工作,除了我明白这个:
恐慌:运行时错误:cgo 参数有指向 Go 指针的 Go 指针
如果我使用 GODEBUG=cgocheck=0 运行,则一切正常。如果我保持默认:
strptr = 4e1cbf ('this is a C string!')
main: yylex returned token 1
yylval.tstrptr 4e1cbf
stringval token "this is a C string!"
The problematic line seems to be:
yylval.stringval = C.GoString(yylval.tstrptr)
我对 C.GoString 的了解很少,它给我的印象是它分配了一个 GO 字符串,并从提供的“C”字符串中填充它,但似乎并非如此,或者为什么我我收到了关于“Go 指向 Go 指针的指针”的投诉?我尝试了许多其他方法,例如让“C”函数 malloc 缓冲区和 GO 函数在其上执行 C.free() 。没有任何效果(有效的地方 == 避免了这种运行时恐慌)。
GO 来源:
package main
import (
"fmt"
"unsafe"
)
// #include <stdio.h>
// int yylex (void * foo,void *tp);
import "C"
type foo_t struct {
i int32
s string
}
var foo foo_t
func main() {
var retval int
var s string
var tp *C.char
for i := 0; i < 2; i++ {
retval = int(C.yylex(unsafe.Pointer(&foo),unsafe.Pointer(&tp)))
fmt.Printf("main: yylex returned %d\n",retval)
fmt.Printf("tp = %x\n",tp)
if retval == 0 {
s = C.GoString(tp)
fmt.Printf("foo.i = %d s = %q\n",foo.i,s)
} else {
foo.s = C.GoString(tp)
fmt.Printf("foo.i = %d foo.s = %q\n",foo.s)
}
}
}
The "C" source
#include <stdio.h>
int yylex (int * foo,char ** tp)
{
static num;
*foo = 666;
*tp = "this is a C string!";
printf ("strptr = %x ('%s')\n",*tp,*tp);
return (num++);
}
有趣的是,如果 GO func 首先存储到 foo.s 中,则对 yylex 的第二次调用会引发恐慌。如果我执行 s 然后执行 foo.s(取决于我检查 retval 为 0 还是非零),它不会失败,但我猜这是因为 GO 函数立即退出并且没有后续调用到 yylex。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。