将 []string 转换为 char * const []。

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

Convert []string to char * const []

问题

你好!根据你提供的代码,你想要将Go语言中的字符串切片[]string转换为C语言中的char * const[]类型。在CGO中,你可以使用C.CString函数将Go字符串转换为C字符串,并使用C.free函数释放内存。下面是修改后的代码示例:

func main() {
    args := os.Args
    argC := convertSliceToCArray(args)
    C.init(C.int(len(args)), argC)
}

func convertSliceToCArray(slice []string) **C.char {
    array := make([]*C.char, len(slice))
    for i, s := range slice {
        array[i] = C.CString(s)
        defer C.free(unsafe.Pointer(array[i]))
    }
    return (**C.char)(unsafe.Pointer(&array[0]))
}

这样,你就可以将Go语言中的字符串切片转换为C语言中的char * const[]类型了。希望对你有帮助!如果你还有其他问题,请随时提问。

英文:

I'm using CGO and here is the C function:

int init(int argc,char * const argv[]){
 //some code
}

I should to send the commandilne args from go to c,here is the golang code:


func main(){
    args := os.Args
    arg_C := convertCSliceToCharArray(args)
    C.init(C.int(len(args)),argC)
}


func convertCSliceToCharArray(slice []string)[]*C.char {
    slice_C := make([]*C.char,len(slice))
    for i,s := range slice{
        char_c := C.CString(s)
        defer C.free(unsafe.Pointer(&char_c))
        slice_C[i] = char_c
    }
    return slice_C

}

Run go build and i got this error cannot use _cgol(variable of type []*_Ctyre_char) as type **_Ctype_char in argument to _Cfunc_init.

So in CGO,the type of char * const[] is **_Ctype_char,how can I convert []string to it?

答案1

得分: 0

这个问题的正确解决方案是:

func main() {
    args := os.Args
    arg_C := convertCSliceToCharArray(args)
    // 使用数组的第一个元素的指针
    C.init(C.int(len(args)), &arg_C[0])
}

func convertCSliceToCharArray(slice []string) []*C.char {
    slice_C := make([]*C.char, len(slice))
    for i, s := range slice {
        char_c := C.CString(s)
        defer C.free(unsafe.Pointer(char_c))
        slice_C[i] = char_c
    }
    return slice_C
}

在C语言中,将char *argv[]作为函数的参数与char **argv是相同的,即指向char*数组的第一个元素的指针。

感谢Paul Hankin的帮助。

英文:

So the right solution of this question is:

func main(){
    args := os.Args
    arg_C := convertCSliceToCharArray(args)
    //use the first element's pointers of the array
    C.init(C.int(len(args)),&arg_C[0])
}


func convertCSliceToCharArray(slice []string)[]*C.char {
    slice_C := make([]*C.char,len(slice))
    for i,s := range slice{
        char_c := C.CString(s)
        defer C.free(unsafe.Pointer(&char_c))
        slice_C[i] = char_c
    }
    return slice_C

}

In C char *argv[] as an argument to a function is the same as char *argv -- ie a pointer to the first element of the char array.

Thanks for Paul Hankin

huangapple
  • 本文由 发表于 2023年4月13日 17:29:01
  • 转载请务必保留本文链接:https://go.coder-hub.com/76003848.html
匿名

发表评论

匿名网友

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

确定