包含char的C结构的大小

时间:2014-08-15 17:06:57

标签: c memory-management

我在C语言中定义了2个结构,包含2个int和1个char。当我打印它们的大小时,它给出的结果我无法证明。这是我的代码:

#include<stdio.h>
struct sample
{
    int a:6;
    int b:12;
    char s;
} st;
struct name
{
    int a:28;
    int b:12;
    char ch;
} st1;

int main()
{
    int i=sizeof(st);
    printf("st : %d\n\n",i);

    i=sizeof(st1);
    printf("st1 : %d\n\n",i);
}

输出是:

st : 4
st1 : 8

st的大小是4字节,st1是8字节?

我发现了这个similar question,但我得到的价值仍然不合理。根据这个问题,我的结构st应该占用3个字节,st1应该占用6个字节。

1 个答案:

答案 0 :(得分:5)

典型的编译器将根据struct成员中最严格的对齐要求来确定结构对齐要求。通常将位字段视为该过程中的普通字段。

这意味着,因为您的第一个结构包含int类型的成员(显然,对齐要求为4),整个结构的对齐要求为4,其大小始终可以被4整除.4是它可能具有的最小尺寸。由于您只使用了18位的位域(至少3个字节),编译器设法将所有内容打包成4个字节。但它不能使它小于4。

(注意,顺便说一句,仅通过计算所需的位数就可以得到总数为26.你在地球上的预期如何适应3个字节,甚至忽略任何对齐注意事项,我不清楚。)

在你的第二个结构中,你使用40位作为位字段(已经涉及5个字节)。现在编译器无法将所有内容打包成4个字节,因此它使用8个字节。同样,结构大小需要被4整除,这意味着如果4不够,则下一个最小大小为8。

如果要覆盖该对齐行为,则必须使用特定于编译器的功能强制将1字节对齐到所有数据类型(#pragma pack等)。这样您就可以减小第二个结构的大小。但是你现在观察到的是在默认对齐设置下的完美预期。