2 dolphin zhangting dolphin_zhangting 于 2014.10.04 14:44 提问

visual c++6.0 结构体占存字节的疑问
c

程序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个字节 ?

2个回答

dolphin_zhangting
dolphin_zhangting   2014.10.04 14:48

楼主补充:头文件 添加了 stdio.h 这里没有显示出来

BillyThe
BillyThe   2014.10.04 22:35

嗨,
这两个问题应该属于内存对齐问题,这里是结构体对齐。

第二个问题中,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));

希望能帮到你

Csdn user default icon
上传中...
上传图片
插入图片