为了账号安全,请及时绑定邮箱和手机立即绑定

Go:将 argv 传递给 C 函数

Go:将 argv 传递给 C 函数

Go
慕雪6442864 2022-01-17 10:59:38
从 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 元素的长度不同,而且性能也很差
查看完整描述

2 回答

?
慕莱坞森

TA贡献1810条经验 获得超4个赞

这是一个最小的例子,我的 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))

}


查看完整回答
反对 回复 2022-01-17
?
慕哥9229398

TA贡献1877条经验 获得超6个赞

无法在 stack-overflow 上添加评论不足的点,但是当我使用 go 1.9 运行时,我必须将最后一行转换为 (**C.char)

C.printArgs(argc, (**C.char)(unsafe.Pointer(c_argv)))


查看完整回答
反对 回复 2022-01-17
  • 2 回答
  • 0 关注
  • 213 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号