如何创建代表 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]
表示为包含三个 char
的 struct
,但它会在 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};
typedef struct _StructWithCArray {
char a[3];
char b;
} StructWithCArray;
我将 a[3]
表示为包含三个 char
的 struct
,但它会在 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};