Go:将 argv 传递给 C 函数

从 Go 1.6 开始,这段代码:


argc := len(*argv)

c_argc := C.int(argc)


c_argv := make([]*C.char, argc)

for index, value := range *argv {

    c_argv[index] = C.CString(value)

    defer C.free(unsafe.Pointer(c_argv[index]))

}


err := C.MPI_Init(&c_argc, (***C.char)(unsafe.Pointer(&c_argv)))

不再工作并且失败了runtime error: cgo argument has Go pointer to Go pointer。我已经阅读了有关使用 malloc() 在 C 中分配数组然后复制所有内容的信息,但这很难做到(因为 argv 元素的长度不同,而且性能也很差


慕雪6442864
浏览 214回答 2
2回答

慕莱坞森

这是一个最小的例子,我的 C 技能相当生疏,所以可能有更好的方法:package main/*#include <stdlib.h>#include <stdio.h>static void* allocArgv(int argc) {&nbsp; &nbsp; return malloc(sizeof(char *) * argc);}static void printArgs(int argc, char** argv) {&nbsp; &nbsp; int i;&nbsp; &nbsp; for (i = 0; i < argc; i++) {&nbsp; &nbsp; &nbsp; &nbsp; printf("%s\n", argv[i]);&nbsp; &nbsp; }}*/import "C"import (&nbsp; &nbsp; "os"&nbsp; &nbsp; "unsafe")func main() {&nbsp; &nbsp; argv := os.Args&nbsp; &nbsp; argc := C.int(len(argv))&nbsp; &nbsp; c_argv := (*[0xfff]*C.char)(C.allocArgv(argc))&nbsp; &nbsp; defer C.free(unsafe.Pointer(c_argv))&nbsp; &nbsp; for i, arg := range argv {&nbsp; &nbsp; &nbsp; &nbsp; c_argv[i] = C.CString(arg)&nbsp; &nbsp; &nbsp; &nbsp; defer C.free(unsafe.Pointer(c_argv[i]))&nbsp; &nbsp; }&nbsp; &nbsp; C.printArgs(argc, unsafe.Pointer(c_argv))}

慕哥9229398

无法在 stack-overflow 上添加评论不足的点,但是当我使用 go 1.9 运行时,我必须将最后一行转换为 (**C.char)C.printArgs(argc,&nbsp;(**C.char)(unsafe.Pointer(c_argv)))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go