结构体的大小与基本类型的大小(32位)

来源:互联网 发布:mp277触摸屏 windows 编辑:程序博客网 时间:2024/04/30 07:05

the size of the basic type in bytes

--------------------------------------------------------------------

sizeof(bool)     is: 1              sizeof(char)     is: 1              sizeof(int)      is: 4

sizeof(long)     is: 4              sizeof(float)    is: 4               sizeof(double)   is: 8

---------------------------------------------------------------------

the size of the pointer

int *p = NULL;

sizeof(p)        is: 4

----------------------------------------------------------------------

the size of Array

int a[10];       int* q = a;

sizeof(a)        is: 40

sizeof(a[0])     is: 4

sizeof(q)        is: 4

-----------------------------------------------------------------------

char* str1 = "my boy";     len = sizeof(str1); 

结果是len = 4,但是char str[7] = "my boy";//注意char str[6] = "my boy";是错误的,原因是数组溢出了,应该为'/0'多留一个单元。len = sizeof(str);结果是len = 7要想知道字符串的大小使用strlen,但是strlen不计算'/0'在内

 --------------------------------------------------------------

the size of struct struct大小取决于以下几点:    ********************************************************************************************    1.每个数据成员与struct首地址之间的偏移值必须是该数据成员大小的整数倍,如果不是则会添加pad;  2.struct的大小必须是其最大成员大小的整数倍,如果不是则在最后添加pad;3.struct的首地址必须是其最大成员大小的整数倍否则在其前面加上pad。        

 如:struct S1{char a;int b;}; sizeof(S1) == 8,因为a与首地址的偏移值是0,0是1的整数倍,满足条件(1)。b的偏移值是1,但是1不是int大小4的倍数,所以会在a之后b之前添加pad,以使得b的偏移值是4的倍数,很明显最小的pad是3 bytes.最后,整个大小是8 bytes,正好是int大小的整数倍。所以S1的大小是8.

如:struct S2{char a;char b;int c;};很明显a占空间1且符合条件(1),b的偏移值是1,也符合条件。c的偏移值是2,但是2却不是int大小的整数倍,所以要在int之前添加pad,pad是2bytes。最后考虑条件(2),所以S2大小是8.

如:struct S3{char a;char b;char c;int d;char e;};我们知道在d之前肯定会加上1bytes的pad,所以1+1+1+pad+4=8,再看e,由于e是1byte,所以e的偏移值肯定是1的整数倍,但是8+1是9,9却不是int的倍数,看条件(2)知道,在e之后要加上pad,这个pad的大小是最小是3,因为9+3是4的倍数。所以S3的大小是12.

 如:struct S4{char a;double b;bool c;int d;char e;};S4的大小是1+(7 bytes pad)+8+1+(3 bytes pad)+4+1+(7 bytes pad) = 32

如:typedef struct SS{ char a; char c; int b; char d; char e; double f; char g;}S; typedef struct AA{ char t; S s; char a; S o;}A; sizeof(S) == 32;这一点没有什么疑问。但是sizeof(A)等于多少呢?现在的问题是成员s要怎样对齐补上pad呢?看条件(3)我们就知道了,s是个struct所以它的首地址必须是其最大成员double大小的整数倍,显然现在它的首地址不是8的整数倍,所以它要在t之后补上7bytes的pad,同理o之前也需要这样,所以最后A的大小等于1+7bytes pad+32+1+7bytes pad+32=80

所以在编写代码时要注意,在指定结构体大小时,不要通过计算这个结构体的各个成员的大小再加起来就得到结构体大小,而是应该使用sizeof(结构体)来计算结构体的大小,为什么?因为可能会有字节对齐的现象啊。我就有过这样的经历!

原创粉丝点击