首页 > 后端开发 > Golang > 如何将 Go 切片传递给 C 函数并处理指针修改?

如何将 Go 切片传递给 C 函数并处理指针修改?

Barbara Streisand
发布: 2024-12-16 18:34:12
原创
954 人浏览过

How to Pass Go Slices to C Functions and Handle Pointer Modifications?

将切片指针传递给 Go 中的 C 函数

当使用 cgo 从 Go 调用 C 函数时,将指针传递给切片。考虑一个 C 函数,如:

int f(int *count, char ***strs);
登录后复制

其中 count 是 strs 数组的长度,strs 是字符串数组,返回值指示错误状态。

在 Go 中,一开始可能会尝试按如下方式传递 count 和 strs:

C.f((*C.int)(&count), (**C.char)(&strs[0]))
登录后复制

但是,这不允许在 C 中修改 strs。要启用此功能,有必要在 C 中分配数组。与 C.CString 类似,必须跟踪释放外部数组的位置,特别是当 C 函数可能分配新数组时。

下面的代码演示了如何分配 C 数组:

cArray := C.malloc(C.size_t(c_count) * C.size_t(unsafe.Sizeof(uintptr(0))))

// Convert the C array to a Go array for indexing
a := (*[1<<30 - 1]*C.char)(cArray)
for index, value := range strs {
    a[index] = C.CString(value)
}

err := C.f(&c_count, (***C.char)(unsafe.Pointer(&cArray)))
登录后复制

在此代码中,cArray 在 C 中分配,a 是该数组的切片包装器以允许索引,每个字符串都复制到 C 中 记忆。函数 f 现在可以修改 C 中的 strs 并将修改后的值返回给 Go。

以上是如何将 Go 切片传递给 C 函数并处理指针修改?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板