当前位置: 首页 > 面试题库 >

cgo:如何从c传递结构数组

慕弘伟
2023-03-14
问题内容

C部分:

struct Person {...}
struct Person * get_team(int * n)

开始部分:

n := C.int(0)
var team *C.struct_Person = C.get_team(&n)
defer C.free(unsafe.Pointer(team))

我可以通过这种方式获取数组的第一个元素。但是如何获得带有n个元素的整个数组呢?以及如何安全地释放它们?


问题答案:

首先,即使您正在使用Go,添加cgo时也不再存在任何“安全”。由您决定何时以及如何释放内存,就像使用C进行编程一样。

在go中使用C数组的最简单方法是通过数组将其转换为切片:

team := C.get_team()
defer C.free(unsafe.Pointer(team))
teamSlice := (*[1 << 30]C.struct_Person)(unsafe.Pointer(team))[:teamSize:teamSize]

最大大小的数组实际上并未分配,但是Go需要恒定大小的数组,并且1<<30要足够大。该阵列将立即转换为切片,并正确设置长度和容量。



 类似资料:
  • 问题内容: 我在C 中有一个方法,该方法将双精度数组作为参数。我从Java调用此方法,需要传递一个双精度数组。C 例程读取和修改数组的值,而我需要Java中的那些更新后的值。我该怎么做呢? 例如,使用C ++例程: 和Java代码: 我猜不能像上面的调用那样对myMethod进行调用…还是可以吗?而在Swig中进行这项工作所需的是什么。如果我无法进行上述调用,如何将我的值获取到C ++代码? 问题

  • 我正在使用基于WebRTC的C代码库为Android开发一个实时通信应用程序(视频和音频)。我使用SWIG生成一个JNI桥,以从Java访问本机代码。调用的行为是通过在应用程序层中定义并在结构中传递给库代码的许多回调函数来确定的。传递这些回调的函数如下所示:

  • 问题内容: 我有一些通过JNI调用的C函数,这些函数带有指向结构的指针,还有一些其他函数将分配/释放指向相同类型结构的指针,以便处理包装程序更加容易。令人惊讶的是,JNI文档很少介绍如何处理C结构。 我的C头文件如下所示: 相应的JNI C包装文件包含: …最后是对应的Java类: 不幸的是,此代码在点击后立即使JVM崩溃。我对JNI有点陌生,不知道可能是什么问题。 编辑 :我应该注意,C代码非常

  • 本文向大家介绍C#调用C++DLL传递结构体数组的终极解决方案,包括了C#调用C++DLL传递结构体数组的终极解决方案的使用技巧和注意事项,需要的朋友参考一下 C#调用C++DLL传递结构体数组的终极解决方案 在项目开发时,要调用C++封装的DLL,普通的类型C#上一般都对应,只要用DllImport传入从DLL中引入函数就可以了。但是当传递的是结构体、结构体数组或者结构体指针的时候,就会发现C#

  • 如何合并数组中的所有结构并生成合并的结构? 例如,使用SparkSQL,我能够读取源json文件并生成数组类型的列,数组中的每个元素都包含一个键:值对。例如,假设我们有一个ArrayType列的值,该列的名称为,值为: 我需要将这个数组类型的列转换为结构类型,其值为{a:1,b:2,c:3}。 由于我是通过读取JSON文件获得模式的,所以我可以使用派生序号获得结果,如: 这个解决方案的问题是,如果

  • 问题内容: 我遇到了一些问题,希望获得帮助。我有一个片段代码,用于嵌入python脚本。这个python脚本包含一个函数,该函数将期望接收一个数组作为参数(在这种情况下,我正在python脚本内使用numpy数组)。我想知道如何将数组从C传递到嵌入式python脚本,作为脚本内函数的参数。更具体地说,有人可以告诉我一个简单的例子。 问题答案: 确实,最好的答案可能是仅使用数组,即使是从C代码中也是