英文:
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
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论