如何在 cgo 函数中操作 C 字符数组?

我有一个C函数,它使用char数组参数调用go-Function。go-Function 必须修改参数的内容。如何做到这一点?


void cFunction() {

 char buffer[9] = "aaabbbccc"; // 9 is in this case correct, it is not a null-terminated-string

 goFunction(buffer);

 // buffer shall be modified

}

func goFunction(cBuffer *C.char) {

  // how to modify 3-5?

  //strncpy(cBuffer+3, "XXX")

}

编辑:更确切地说。我必须实现一个回调函数,它接受一个外参数,我必须操纵它。


  void callback(char outbuffer[9]) {

    goFunction(outbuffer);

  }

正如我理解弗兰克斯的答案,我应该做这样的事情


  allocate new go buffer

  convert C buffer to go buffer

  manipulate go buffer

  allocate new C buffer

  convert go buffer to C buffer

  memcpy C buffer into outbuffer

对于我的口味来说,这是太多的分配和转换。


慕田峪9158850
浏览 167回答 2
2回答

qq_花开花谢_0

请参阅将 C 数组转换为 Go 切片的文档,以获取包含 C 数据的可索引 Go 切片。由于要就地修改 C 缓冲区数据,因此使用 Go 切片作为代理,只需将同一缓冲区传递给回调即可。请注意,using 可能会为切片分配一个新的 Go 数组,因此您需要避免这种情况,并确保事先在缓冲区中有足够的可用空间。appendfunc goFunction(cBuffer *C.char, length int) {&nbsp; &nbsp; slice := (*[1 << 28]C.char)(unsafe.Pointer(cBuffer))[:length:length]&nbsp; &nbsp; // slice can now be modified using Go syntax, without pointer arithmetic&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; C.callback(cBuffer)}

慕雪6442864

不建议在 Go 中修改 C 结构,或在 C 中修改 Go 结构。在接口 Ref1 中转换它。一些特殊函数通过创建数据的副本在Go和C类型之间进行转换。在伪围棋定义中更多,为您提供一种使用零副本转换字符串的方法,Ref2。func char2Slice(data unsafe.Pointer, len C.int) []byte {&nbsp; &nbsp; var value []byte&nbsp; &nbsp; sH := (*reflect.SliceHeader)(unsafe.Pointer(&value))&nbsp; &nbsp; sH.Cap, sH.Len, sH.Data = int(len), int(len), uintptr(data)&nbsp; &nbsp; return value}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go