将字符串数组作为参数从Go传递给C函数

huangapple go评论81阅读模式
英文:

Passing array of string as parameter from go to C function

问题

我有一个C函数:

int cgroup_change_cgroup_path(const char * path, pid_t pid, const char *const  controllers[])

我想通过使用cgo在Go语言中调用它。
如何传递第三个参数,因为它接受一个C字符串数组。

英文:

I have one C function:

int cgroup_change_cgroup_path(const char * path, pid_t pid, const char *const  controllers[])

I want to call it in go language by using cgo.
How to pass the third parameter as it accepts a C array of string.

答案1

得分: 3

你可以使用 C 辅助函数构建数组,然后使用它们。

以下是解决同样问题的一个解决方案:

// C 辅助函数:

static char** makeCharArray(int size) {
return calloc(sizeof(char*), size);
}

static void setArrayString(char **a, char *s, int n) {
a[n] = s;
}

static void freeCharArray(char **a, int size) {
int i;
for (i = 0; i < size; i++)
free(a[i]);
free(a);
}

// 从 sargs []string 在 Go 中构建 C 数组

cargs := C.makeCharArray(C.int(len(sargs)))
defer C.freeCharArray(cargs, C.int(len(sargs)))
for i, s := range sargs {
C.setArrayString(cargs, C.CString(s), C.int(i))
}

John Barham 在 golangnuts 上发布的帖子

英文:

You can build the arrays using c helper functions and then use them.

Here is a solution to the same problem:

// C helper functions:

static char**makeCharArray(int size) {
        return calloc(sizeof(char*), size);
}

static void setArrayString(char **a, char *s, int n) {
        a[n] = s;
}

static void freeCharArray(char **a, int size) {
        int i;
        for (i = 0; i &lt; size; i++)
                free(a[i]);
        free(a);
}

// Build C array in Go from sargs []string

cargs := C.makeCharArray(C.int(len(sargs)))
defer C.freeCharArray(cargs, C.int(len(sargs)))
for i, s := range sargs {
        C.setArrayString(cargs, C.CString(s), C.int(i))
}

golangnuts post by John Barham

huangapple
  • 本文由 发表于 2017年9月1日 18:03:14
  • 转载请务必保留本文链接:https://go.coder-hub.com/45997786.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定