包含char的C结构的大小

Sou*_*abh 2 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);
}
Run Code Online (Sandbox Code Playgroud)

输出是:

st : 4
st1 : 8
Run Code Online (Sandbox Code Playgroud)

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

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

AnT*_*AnT 5

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

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

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

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

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