如何创建代表 c 数组的 `ffi_type`?

How to create an `ffi_type` that represents a c array?

typedef struct _StructWithCArray {
  char a[3];
  char b;
} StructWithCArray;

我将 a[3] 表示为包含三个 charstruct,但它会在 iOS i386 模拟器上失败。

有人知道如何处理这个问题吗?


这是一个 demo 来显示错误。您应该使用不比 iPhone 5 更新的模拟器到 运行 BugReport 项目,并且比 iPhone 5 更新的模拟器在这种情况下似乎没有问题。

包含 3 个字符的结构与包含 3 个字符的数组不同。它甚至不能安全地铸造。你将不得不做

StructWithCArray swc;
swc.a[0] = s.c1;
swc.a[1] = s.c2;
swc.a[2] = s.c3;

如果您不关心代码不可移植,并且您知道数组和结构的内存布局是相同的,您可以使用 memcpy 复制 3 个字符。

libffi 没有数组类型的内置概念,主要是因为无法将数组传递给 C 中的函数——它总是作为指针衰减。然而,正如您所发现的,这并不理想,因为您可能仍需要将数组表示为结构的元素。也就是说,这是对 libffi 的疏忽。

解决方法是简单地为数组的每个元素向结构中添加一个元素。在您的情况下,您将添加三个 char 字段。这通常有效,因为数组与其元素具有相同的对齐方式。

libffi documentation 现在明确提到了这种方法。

这个呢

ffi_type* ffi_type_nullptr = 0;
ffi_type ffi_type_array;

ffi_type_array.alignment = ffi_type_uchar.alignment;
ffi_type_array.size = ffi_type_uchar.size * 3;
ffi_type_array.type = FFI_TYPE_STRUCT; // Trick.
ffi_type_array.elements = &ffi_type_nullptr; // Pointer to a null pointer.

ffi_type* members[2];
members[0] = & ffi_type_array;
members[1] = 0;

ffi_type ffi_type_T = {0, 0, FFI_TYPE_STRUCT, members};