1

假设我有一个结构:

struct myStruct
{
    int a;
    short b;
    char c;
};

在 Windows 中,MSDN 声明 int占用 4 个字节、short占用 2 个字节和char占用 1 个字节。总共最多 7 个字节。

我知道大多数编译器会用未指定的字节数填充结构以改善对齐。所以,当我执行这个程序时,

#include <stdio.h>

int main(void) {
    printf("%d\n", sizeof(struct myStruct));
    return 0;
}

我得到8. 这意味着填充了 1 个字节。

有什么方法可以让我可以维护地确定struct代码中的大小(没有加起来单独sizeof的 s)?

我问这个是因为以后,如果我需要更改我的结构以包含大约十五个元素,并且如果我再添加五个结构,我所有的struct sizeofs 都会改变,导致事情变得混乱。

4

2 回答 2

3

您可以强制执行它:

#define C_ASSERT(expr) extern char CAssertExtern[(expr)?1:-1]

C_ASSERT(sizeof(struct myStruct) == 7); // or 8, whichever you want

每当大小偏离 7 时,代码就会停止编译。

您可以做类似的事情来强制结构成员的偏移量。你需要这个offsetof()宏。

于 2013-04-10T06:24:49.723 回答
0

你可以试试pragma pack。它有助于保持对齐并具有许多灵活性。检查这个 http://publib.boulder.ibm.com/infocenter/comphelp/v101v121/index.jsp?topic=/com.ibm.xlcpp101.aix.doc/compiler_ref/pragma_pack.html

更新:刚刚看到你的评论,也许 pack 不是你的解决方案

于 2013-04-10T06:50:46.383 回答