我正在使用一个库,该库具有一个接受结构数组的函数。该结构和函数具有以下布局:
struct TwoInt32s
{
int32_t a;
int32_t b;
};
void write(struct TwoInt32s *buffer, int len);
我的初始测试表明,此类结构的数组与 int32_t
的数组具有相同的内存布局,因此我可以这样做:
int32_t *buffer = malloc(2 * len * sizeof(int32_t));
/* fill in the buffer */
write((struct TwoInt32s*)buffer, len);
但是我想知道这是否普遍适用。使用 int32_t
数组大大简化了我的代码。
编辑:我忘记了 sizeof
根据我的阅读,C 保证了一些关于结构填充的事情:
- 成员不会被重新排序
- 填充只会在具有不同对齐方式的成员之间或结构的末尾添加
- 指向结构的指针指向与指向其第一个成员的指针相同的内存位置
- 每个成员都以适合其类型的方式对齐
- 为了实现对齐,结构中可能有未命名的空洞
据此我可以推断 a
和 b
之间没有填充。但是,该结构可能会在末尾进行填充。我对此表示怀疑,因为它在 32 位和 64 位系统上都是字对齐的。有人对此有更多信息吗?
最佳答案
该实现可以自由填充结构 - a
和 b
之间可能有未使用的字节。但是可以保证第一个成员不会从结构的开头偏移。
通常,您使用特定于编译器的编译指示来管理此类布局,例如:
#pragma pack(push)
#pragma pack(1)
struct TwoInt32s
{
int32_t a;
int32_t b;
};
#pragma pack(pop)
关于将一个整数结构转换为一个整数数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5381270/