关于结构体的大小,我在网上看到一篇文章,或许对你有帮助
本文来源自:http://blog.
————小小e家人
本人今天被华为鄙视了一下,痛定思痛,总结一些自己的不足之处,给大家分享一下,本次只说sizeof,总结的还不全面,也可能有些理解上的偏差,望大家不吝赐教,也希望大家有新的用法拿出来交流一下:
一切以实例说明
例1: char string[]="hello";
char *p=string;
sizeof(string) =?
sizeof(p)=?
答:sizeof(string)=6
sizeof(p)=4.
分析:字符串有一个默认的结束符号"\0", 而这个结束符号是不会显示在字符串中的,char型的数据一个大小就是1,所以,第一个长度为6;而第二指针,它虽然是指向char类型的数组,但指针本身确实一个4字节的整型数据,所以,第二个位4.
例2:char arr[3][5];
char (*p)[5];
p=arr;
long **q;
char **a[2][3];
sizeof(arr)=?
sizeof(p)=?
sizeof(q)=?
sizeof(*q)=?
sizeof(a)=?
答 :
sizeof(arr)=15
sizeof(p)=4
sizeof(q)=4
sizeof(*q)=4
sizeof(a)=24
分析:数组的维数和数组的类型决定,数字的sizeof大小,第一个就是 3x5x1=15; 后面三个再一次说明一个问题,一个指针不管指向何种 类型,指针本身就是一个四字节的整数,所以不论什么样的指针大小都是 4 ,而a是一个指针数组,里面存的全是指针,所以sizeof(a)=2*3*4=24
例3:void Fun(char str[10])
{
sizeof(str)=?
}
答: sizeof(str)=4
分析:str是函数的参数,它在做sizeof运算时,被认为是指针;因为调用函数Fun(str)时,数组是传址的,程序会在栈上分配4个字节 的指针来指向数据。
下面结合结构体说一下sizeof的使用 本系统定义short型为2字节
int为4字节
char为1字节
例4:struct AA
{
char
aa;//char aa[3];
short
ab;
int
ac;
};
struct BB
{
char ba;
int
bc;
//b,c顺序颠倒一下
short bb;
};
struct
CC
{
short cb;
int
cc;
struct AA
aa;
char ca;
};
struct DD
{
int
dc;
short
db;
char
da;
}
struct AA
a;
struct BB
b;
struct CC c;
struct DD d;
sizeof(a)=?
sizeof(b)=?
sizeof(c)=?
sizeof(d)=?
答:sizeof(a)=8
sizeof(b)=12
sizeof(c)=20
sizeof(d)=8
分析:肯定有人会怀疑 a不就只有三个变量吗? 而三个相加 1+2+4=7 嘛,怎么会是8呢? 而且b和a只有其中两个变量颠倒了一下位置,为
啥结果就不一样了呢?
其实这里面牵涉到一个变量对齐的问题,一个结构体里面的变量存储的空间应以其成员最长的那个数据类型来对齐的,而且对齐方式是逐步的,不是一下子就把所有的变量的都这样对齐的,是有先后逐步顺序的。最后所有存储的字节大小必须是本结构体最长基本类型的整数倍
拿AA来说,第一个出现的变量是 char型的存入存储器的也只有一个字节,而紧接着是一个short类型的,short类型的是两个字节的,加上前面一个字节是3个,这样在内存中,不能对齐,存取都不方便,所以目前默认的存储方式就是把前面空一个字节,然后再存int型数据,而此时前面刚刚好有四个字节是对齐的,所以,现在就不用为了对齐在前面填充空字节了,1+1+2+4=8。( 如果第一个是char aa[3],那么结果又等于多少呢? 原理一样,先存三个字节, 根据接下来的是个short 的型的,我们在前面补充一个字节,再接下来是一个int型的,此时前面只有3+1+2=6个字节,不是int型4字节的整数倍,只好继续在前面填充2,最终结果就是:3+1+2+2+4=12)
BB 里面的变量出现的顺序和AA就不一样了,首先出现一个char型变量占一个字节,紧接着就是一个int型指针,占四个字节,和前面的不齐,怎么办,只有在前面填充3个字节,这样看起来就工整一些了;接着又出现一个short型的了,而此时前面已经规定了四字节对齐,short只有两个字节怎么办,只好空两个字节,所以BB 就成了1+3+4+2+2=12字节了;至于CC大家自己分析一下吧,俺就不罗嗦了。
DD的计算是 4+2+1+1=8,我的理解就是,整体思路要存的数肯定是4 的整数倍,而short型的是2,但后面还有更短的字节存进来,所以先把后面的数先存进来,在进行对齐处理。
对上述四个sizeof在内存中,存储的情况模拟如下:
AA:=8
|char
|------|---short---|
|------------int------------|
BB:=12
|char
|------|------|------|
|------------int------------|
|----short---|------|------|
CC:=20
|----short---|------|------|
|------------int------------|
|char
|------|---short---|
|------------int------------|
|char
|------|------|------|
DD:=8
|------------int------------|
|---short---|char
|------|