typedef struct _StructWithCArray {
char a[3];
char b;
} StructWithCArray;
我将a[3]
表示为struct
包含三个char
,但它会在iOS i386模拟器上失败。
任何人都有任何想法如何处理?
这是显示错误的demo。您应该使用不比iPhone 5
更新的模拟器来运行BugReport
项目,并且在这种情况下,比iPhone 5
更新的模拟器似乎没有问题。
答案 0 :(得分:0)
包含3个字符的结构与3个字符的数组不同。它甚至不能安全浇铸。你必须要做
StructWithCArray swc;
swc.a[0] = s.c1;
swc.a[1] = s.c2;
swc.a[2] = s.c3;
如果您不关心代码是不可移植的,并且您知道数组和结构的内存布局相同,则可以使用memcpy
复制3个字符。
答案 1 :(得分:0)
libffi没有内置的数组类型概念,主要是因为没有办法将数组传递给C中的函数 - 它总是作为指针衰减。但是,正如您所发现的,这并不理想,因为您可能仍需要将数组表示为结构的元素。也就是说,这是对libffi的疏忽。
解决方法是简单地为数组的每个元素添加一个元素到结构中。在您的情况下,您将添加三个char
字段。这通常起作用,因为数组具有与其元素相同的对齐方式。
libffi documentation现在明确提到了这种方法。
答案 2 :(得分: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};