由于各种原因,我有一些结构要强制为特定大小(在本例中为64字节和512字节)。然而,两者都低于我希望它们的尺寸。
我有没有告诉编译器将它们设置为这些特定的大小并用零填充,或者我最好只在结构中声明构成多余空间的数组,以便它在大小上对齐我想要吗?
答案 0 :(得分:18)
您可以使用联盟。
struct mystruct_s {
... /* who knows how long */
};
typedef union {
struct mystruct_s s;
unsigned char padding[512];
} mystruct;
这将确保联合为512字节或更多。然后,您可以使用代码中的某处静态断言确保它不超过512个字节:
/* Causes a compiler error if sizeof(mystruct) != 512 */
char array[sizeof(mystruct) != 512 ? -1 : 1];
如果您使用的是C11,则可以采用更好的方法。我还不认识任何使用C11的人。该标准于几周前发布。
_Static_assert(sizeof(mystruct) == 512, "mystruct must be 512 bytes");
请注意,使用零填充的唯一方法是手动将零(calloc
或memset
)放在那里。编译器忽略填充字节。
答案 1 :(得分:0)
我认为没有办法自动化这个,至少在我使用的编译器gcc中是这样。你必须填补你的结构。
注意结构中automatic alignment个变量。例如 struct example { char a; int b; }
不需要5个字节,而是8个。