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

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

任何人都知道如何处理这个问题?


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

4

3 回答 3

0

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

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

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

于 2017-04-17T20:13:30.930 回答
0

那这个呢。

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};
于 2017-12-09T13:19:01.397 回答
0

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

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

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

于 2017-04-20T16:37:09.613 回答