坚持这个问题.只能获得通过结构的第一个成员……我做错了什么?将结构从Go传递给C的正确方法是什么?
这是我的例子,说明它不起作用:
package main /* #include <stdio.h> typedef struct { int a; int b; } Foo; void pass_array(Foo **in) { int i; for(i = 0; i < 2; i++) { fprintf(stderr,"[%d,%d]",in[i]->a,in[i]->b); } fprintf(stderr,"\n"); } void pass_struct(Foo *in) { fprintf(stderr,%d]\n",in->a,in->b); } */ import "C" import ( "unsafe" ) type Foo struct { A int B int } func main() { foo := Foo{25,26} foos := []Foo{{25,26},{50,51}} // wrong result = [25,0] C.pass_struct((*_Ctype_Foo)(unsafe.Pointer(&foo))) // doesn't work at all,SIGSEGV // C.pass_array((**_Ctype_Foo)(unsafe.Pointer(&foos[0]))) // wrong result = [25,0],[50,0] out := make([]*_Ctype_Foo,len(foos)) out[0] = (*_Ctype_Foo)(unsafe.Pointer(&foos[0])) out[1] = (*_Ctype_Foo)(unsafe.Pointer(&foos[1])) C.pass_array((**_Ctype_Foo)(unsafe.Pointer(&out[0]))) }
解决方法
问题是Foo和_Ctype_Foo是不同的结构.
我猜你会在64位上运行.请注意,int是64位,但很可能是C中的32位.
如果我将Foo的定义更改为this,那么它可以在我的机器上运行(64位linux)
type Foo struct { A int32 B int32 }
但是我会说这是一个麻烦的方法 – 让你的Go和C代码使用相同的结构
type Foo _Ctype_Foo
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。