C中的力特定结构尺寸

时间:2012-01-02 21:46:58

标签: c memory struct sizeof system

由于各种原因,我有一些结构要强制为特定大小(在本例中为64字节和512字节)。然而,两者都低于我希望它们的尺寸。

我有没有告诉编译器将它们设置为这些特定的大小并用零填充,或者我最好只在结构中声明构成多余空间的数组,以便它在大小上对齐我想要吗?

2 个答案:

答案 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");

请注意,使用填充的唯一方法是手动将零(callocmemset)放在那里。编译器忽略填充字节。

答案 1 :(得分:0)

我认为没有办法自动化这个,至少在我使用的编译器gcc中是这样。你必须填补你的结构。

注意结构中automatic alignment个变量。例如     struct example {         char a;         int b;     }

不需要5个字节,而是8个。