Go:将 argv 传递给 C 函数

标签 go argv cgo

从 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)))

不再工作并因运行时错误而失败: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))
}

playground

关于Go:将 argv 传递给 C 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37657326/

相关文章:

testing - Golang 测试 : "no test files"

c - 为什么数组名argv可以赋值?

objective-c - Golang + cgo - AppDelegate 实现不起作用

go - 如何使用最少的 Cgo 为 DLL 使用 Go 回调?

linux - cgo 交叉编译找不到库

go - 从子包中的 main 导入 vars/consts

go - 转换接口(interface)可以反射(reflect)数组类型

regex - 在 Go 中匹配段落

linux - 比较缓冲区与 argv 错误

c - 从函数中的 argv 分配指针