关于sizeof()

[复制链接]
查看11 | 回复3 | 2010-11-10 10:40:17 | 显示全部楼层 |阅读模式
见下面代码:
#pragma pack(4)
union A
{
char m[7];
short int n;
}a;
struct B
{
char c; //这个下面会改动
union A a;
}b;
void main()
{
printf("%d\n",sizeof(union A));
printf("%d\n",sizeof(struct B));
}
#pragma pack()
最后结果是8,10. 对于8没有疑问,只是一直想不通sizeof(struct B)为何是10。
如果将char c; 改为 short c; 也是这个答案。如果将char c;改为 int c;此时答案就是8,12了。对于后面两个我能理解,就是对于在char c;时为何也是10实在想不明白。这里请高人指点,先谢了!

回复

使用道具 举报

千问 | 2010-11-10 10:40:17 | 显示全部楼层
首先要理解#pragma pack(4) 的含义,#pragma pack(4)表示程序保证对齐字节小于4字节的数据域字节是对齐的(以要求对齐字节数最大且不大于4的域为准),而不是结构中的每一个数据域都要以4字节对齐。如:union A{char m[7];short int n;}a;其中char:1字节对齐,chort int:2字节对齐;所以union A实际要以2字节对齐,sizeof(union A)为8而对于struct B{char c; //这个下面会改动union A a;}b;char c:1字节对齐,union A:2字节对齐;所以struct B实际要以2字
回复

使用道具 举报

千问 | 2010-11-10 10:40:17 | 显示全部楼层
在c++中size()和sizeof()用法说明:1、size()是取字符串长度的,跟length()用法相同。举例:string str="0123456789";cout <<"str.length()="<<str.length()<<endl;//结果为10cout <<"str.size()="<<str.s
回复

使用道具 举报

千问 | 2010-11-10 10:40:17 | 显示全部楼层
可以理解首先看union A 里面是 char 这个是可以单字节对齐的但是 short int 这个是 2字节对齐的所以struct 里面必须保持 short int 定义在2字节对齐的位置char 是单字节,后面必须空出来一个字节,才能保持short int2字节对齐特性 所以实际内存分布00----char c01
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行