我在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个字节。
答案 0 :(得分:5)
典型的编译器将根据struct成员中最严格的对齐要求来确定结构对齐要求。通常将位字段视为该过程中的普通字段。
这意味着,因为您的第一个结构包含int
类型的成员(显然,对齐要求为4),整个结构的对齐要求为4,其大小始终可以被4整除.4是它可能具有的最小尺寸。由于您只使用了18位的位域(至少3个字节),编译器设法将所有内容打包成4个字节。但它不能使它小于4。
(注意,顺便说一句,仅通过计算所需的位数就可以得到总数为26.你在地球上的预期如何适应3个字节,甚至忽略任何对齐注意事项,我不清楚。)
在你的第二个结构中,你使用40位作为位字段(已经涉及5个字节)。现在编译器无法将所有内容打包成4个字节,因此它使用8个字节。同样,结构大小需要被4整除,这意味着如果4不够,则下一个最小大小为8。
如果要覆盖该对齐行为,则必须使用特定于编译器的功能强制将1字节对齐到所有数据类型(#pragma pack
等)。这样您就可以减小第二个结构的大小。但是你现在观察到的是在默认对齐设置下的完美预期。