Go:将 argv 传递给 C 函数
Go: passing argv to C function
从 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 元素具有不同的长度并且性能也很差
这是一个最小的例子,我的 C 技能很生疏,所以可能有更好的方法:
package main
/*
#include <stdlib.h>
#include <stdio.h>
static void* allocArgv(int argc) {
return malloc(sizeof(char *) * argc);
}
static void printArgs(int argc, char** argv) {
int i;
for (i = 0; i < argc; i++) {
printf("%s\n", argv[i]);
}
}
*/
import "C"
import (
"os"
"unsafe"
)
func main() {
argv := os.Args
argc := C.int(len(argv))
c_argv := (*[0xfff]*C.char)(C.allocArgv(argc))
defer C.free(unsafe.Pointer(c_argv))
for i, arg := range argv {
c_argv[i] = C.CString(arg)
defer C.free(unsafe.Pointer(c_argv[i]))
}
C.printArgs(argc, unsafe.Pointer(c_argv))
}
无法在 stack-overflow 上添加评论点数不足,但是当我使用 go 1.9 运行 时,我必须将最后一行转换为 (**C.char)
C.printArgs(argc, (**C.char)(unsafe.Pointer(c_argv)))
从 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 元素具有不同的长度并且性能也很差
这是一个最小的例子,我的 C 技能很生疏,所以可能有更好的方法:
package main
/*
#include <stdlib.h>
#include <stdio.h>
static void* allocArgv(int argc) {
return malloc(sizeof(char *) * argc);
}
static void printArgs(int argc, char** argv) {
int i;
for (i = 0; i < argc; i++) {
printf("%s\n", argv[i]);
}
}
*/
import "C"
import (
"os"
"unsafe"
)
func main() {
argv := os.Args
argc := C.int(len(argv))
c_argv := (*[0xfff]*C.char)(C.allocArgv(argc))
defer C.free(unsafe.Pointer(c_argv))
for i, arg := range argv {
c_argv[i] = C.CString(arg)
defer C.free(unsafe.Pointer(c_argv[i]))
}
C.printArgs(argc, unsafe.Pointer(c_argv))
}
无法在 stack-overflow 上添加评论点数不足,但是当我使用 go 1.9 运行 时,我必须将最后一行转换为 (**C.char)
C.printArgs(argc, (**C.char)(unsafe.Pointer(c_argv)))