[英]How to make cgo return array to c?
我用c
调用golang
,我想返回一个string array
和一个int array
,我这样做是这样的:
package main
import "C"
//export Seg
func Seg(input *C.char, segs *[]*C.char, tags *[]int) (errChars *C.char) {
count := 10
segs_ := make([]*C.char, 10, 10)
for i:=0; i<count; i++ {
segs_[i] = C.CString("aaaaaa")
}
segs = &segs_
tags_ := make([]int, count)
for i:=0; i<count; i++ {
tags_[i] = i
}
tags = &tags_
return
}
func main() {}
建立
go build -o libacrf.so -buildmode=c-shared clib.go
这样称呼它:
#include <stdio.h>
#include <stdlib.h>
#include "libacrf.h"
int main(int argc, char *argv[])
{
GoSlice *segs, *tags;
char* err;
err = Seg("hahahhaha", segs, tags);
if (err != NULL) {
fprintf(stderr, "error: %s\n", err);
free(err);
return 1;
}
printf("%llu\n", (*tags).len); // it should be 10, but it is not right now
return 0;
}
但是问题是我无法从golang获得真正的结果。
这并没有什么关系C,你覆盖的拷贝tags
和segs
指针值,而不是分配新的切片值; 。 首先在Go中创建示例,以便准确了解您的工作。 https://play.golang.org/p/EQWRiqVwqm
为了将_tags
值分配给指针,语法应为
*tags = _tags
我认为这是因为您负责所有C端数据的内存管理。 在C语言中, GoSlice
只是typedef struct { void *data; GoInt len; GoInt cap; } GoSlice;
typedef struct { void *data; GoInt len; GoInt cap; } GoSlice;
在您的示例中,您仅将未初始化的指针传递给GoSlice:
GoSlice *segs, *tags; //here
char* err;
err = Seg("hahahhaha", segs, tags);
因此,您可以在此存储位置读/写纯属幸运。 尽管Go不会通过c代码管理您的内存块,但它也不会设置len字段。 尽管以上只是假设(我对Go并不太了解),但支持我的假设的一些证据将是这种修改:
int main(int argc, char *argv[])
{
GoInt data[10] = {77, 12, 5, 99, 28, 23, 33,33,33,33};
GoSlice segs_d = {data, 10, 10};
GoInt data2[10] = {77, 12, 5, 99, 28, 23, 33,33,33,33};
GoSlice tags_d = {data2, 10, 10};
GoSlice *segs, *tags;
segs= &segs_d;
tags= &tags_d;
char* err;
err = Seg("hahahhaha", segs, tags);
if (err != NULL) {
fprintf(stderr, "error: %s\n", err);
free(err);
return 1;
}
printf("%llu\n", (*tags).len); // it should be 10, but it is not right now
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.