繁体   English   中英

如何使cgo将数组返回给c?

[英]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,你覆盖的拷贝tagssegs指针值,而不是分配新的切片值; 首先在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM