我正在使用一个具有一个结构数组的函数的库.该结构和函数具有以下布局:
struct TwoInt32s
{
int32_t a;
int32_t b;
};
void write(struct TwoInt32s *buffer, int len);
Run Code Online (Sandbox Code Playgroud)
我的初步测试表明,这样的结构数组具有与数组相同的内存布局,int32_t所以我可以这样做:
int32_t *buffer = malloc(2 * len * sizeof(int32_t));
/* fill in the buffer */
write((struct TwoInt32s*)buffer, len);
Run Code Online (Sandbox Code Playgroud)
但是,我想知道这是否普遍适用.使用数组int32_t大大简化了我的代码.
编辑:我忘了sizeof
根据我的阅读,C保证了一些关于struct padding的东西:
从这里我可以推断它a并且b它们之间没有填充.但是结构可能最后会有填充.我对此表示怀疑,因为它在32位和64位系统上都是字对齐的.有没有人有这方面的其他信息?
Eri*_*rik 10
实施自由垫结构-有可能是在两者之间未使用的字节a和b.但是可以保证第一个成员不会从结构的开头偏移.
通常,您使用特定于编译器的编译指示来管理此类布局,例如:
#pragma pack(push)
#pragma pack(1)
struct TwoInt32s
{
int32_t a;
int32_t b;
};
#pragma pack(pop)
Run Code Online (Sandbox Code Playgroud)