关于C语言结构体内存的问题,求帮助
struct P1
{
    int a;
    int b;
    double c[10];
};
struct P2
{
    int a;
    int b;
    char c[10];
};

sizeof(struct P) , P1结果是88 P2的结果是20.
为什么会这样?

3个回答

第一个4+4+8*10=88
第二个4+4+10=18,但是编译器按照4字节对齐,所以向上取4的倍数20

caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复yirol_: 不同的编译器不同,一般对于32bit环境,4字节对齐是效率最高的,8字节浪费空间。对于64bit,8字节(理论上)是最优的。
大约 2 年之前 回复
yirol_
GetsuKami-Hao 刚测试了下,把int 换成double,应该是26,对齐后输出结果是32,这里是按照8进行对齐的。
大约 2 年之前 回复
yirol_
GetsuKami-Hao 都是按照四字节对齐吗?
大约 2 年之前 回复

字节对齐导致,不满4的倍数编译器会自动填充空间

网上看到的
struct test
{
char x1;
short x2;
float x3;
char x4;
};

由于编译器默认情况下会对这个struct作自然边界(有人说“自然对界”我觉得边界更顺口)对齐,结构的第一个成员x1,其偏移地址为0,占据了第1个字节。第二个成员x2为short类型,其起始地址必须2字节对界,因此,编译器在x2和x1之间填充了一个空字节。结构的第三个成员x3和第四个成员x4恰好落在其自然边界地址上,在它们前面不需要额外的填充字节。在test结构中,成员x3要求4字节对界,是该结构所有成员中要求的最大边界单元,因而test结构的自然对界条件为4字节,编译器在成员x4后面填充了3个空字节。整个结构所占据空间为12字节。

文章的地址
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!