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

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

Convert []string to char * const []

问题

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

  1. func main() {
  2. args := os.Args
  3. argC := convertSliceToCArray(args)
  4. C.init(C.int(len(args)), argC)
  5. }
  6. func convertSliceToCArray(slice []string) **C.char {
  7. array := make([]*C.char, len(slice))
  8. for i, s := range slice {
  9. array[i] = C.CString(s)
  10. defer C.free(unsafe.Pointer(array[i]))
  11. }
  12. return (**C.char)(unsafe.Pointer(&array[0]))
  13. }

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

英文:

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

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

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

  1. func main(){
  2. args := os.Args
  3. arg_C := convertCSliceToCharArray(args)
  4. C.init(C.int(len(args)),argC)
  5. }
  6. func convertCSliceToCharArray(slice []string)[]*C.char {
  7. slice_C := make([]*C.char,len(slice))
  8. for i,s := range slice{
  9. char_c := C.CString(s)
  10. defer C.free(unsafe.Pointer(&char_c))
  11. slice_C[i] = char_c
  12. }
  13. return slice_C
  14. }

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

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

  1. func main() {
  2. args := os.Args
  3. arg_C := convertCSliceToCharArray(args)
  4. // 使用数组的第一个元素的指针
  5. C.init(C.int(len(args)), &arg_C[0])
  6. }
  7. func convertCSliceToCharArray(slice []string) []*C.char {
  8. slice_C := make([]*C.char, len(slice))
  9. for i, s := range slice {
  10. char_c := C.CString(s)
  11. defer C.free(unsafe.Pointer(char_c))
  12. slice_C[i] = char_c
  13. }
  14. return slice_C
  15. }

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

感谢Paul Hankin的帮助。

英文:

So the right solution of this question is:

  1. func main(){
  2. args := os.Args
  3. arg_C := convertCSliceToCharArray(args)
  4. //use the first element's pointers of the array
  5. C.init(C.int(len(args)),&arg_C[0])
  6. }
  7. func convertCSliceToCharArray(slice []string)[]*C.char {
  8. slice_C := make([]*C.char,len(slice))
  9. for i,s := range slice{
  10. char_c := C.CString(s)
  11. defer C.free(unsafe.Pointer(&char_c))
  12. slice_C[i] = char_c
  13. }
  14. return slice_C
  15. }

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:

确定