程序1:
#include
int main(void)
{
struct stu
{
double a;
int b;
}tex;
printf("%d %d %d \n", sizeof(stu), sizeof(tex.a), sizeof(tex.b) );
return 0;
}
结果:16 8 4 //疑问:为什么 sizeof(stu) 不等于 sizeof(tex.a)和 sizeof(tex.b) 的和 12 , 而相差了4个字节?
程序2:
#include
int main(void)
{
struct stu
{
char c;
int b;
} tex;
printf("%d %d %d \n", sizeof(stu), sizeof(tex.a), sizeof(tex.c) );
return 0;
}
结果:8 1 4 //疑问:相差3个字节 ?
嗨,
这两个问题应该属于内存对齐问题,这里是结构体对齐。
第二个问题中,char c占用1个字节,int b占用4个字节,int b要求4字节对齐,所以结构体变量实际占用的空间为1(c)+3(用于对齐访问)+4(b);
第一个问题有点复杂,根据上面的分析,double应该占用8个字节,int占4个字节,应该占用12字节;但是结构体对齐中还有一点是:结构体会按照内长度最大(这里是double)成员大小对齐,所以结构体实际占用空间为8+4+4(用于结构体8字节对齐);
PS:这些规则还与编译器编译规则有关,比如gcc中的#pragma pack(n)或__attribute__((packed));
希望能帮到你
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。