将结构和结构数组从Go传递给C函数

前端之家收集整理的这篇文章主要介绍了将结构和结构数组从Go传递给C函数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
坚持这个问题.只能获得通过结构的第一个成员……我做错了什么?将结构从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

猜你在找的C&C++相关文章