sizeof
1 #include <iostream>
2 #include<stdio.h>
3 #include<string.h>
4 using namespace std;
5 struct
6 {
7 short a1;
8 short a2;
9 short a3;
10 }A;
11 struct
12 {
13 long a1;
14 short a2;
15
16 }B;
17 main()
18 {
19 char *ss1="0123456789";
20 char ss2[]="0123456789";
21 char ss3[100]="0123456789";
22 int ss4[100];
23 char q1[]="abc";
24 char q2[]="a\n";
25 char *q3="a\n";
26 char *str1=(char *)malloc(100);
27 void *str2=(void *)malloc(100);
28 cout<<sizeof(ss1)<<endl;
29 cout<<sizeof(ss2)<<endl;
30 cout<<sizeof(ss3)<<endl;
31 cout<<sizeof(ss4)<<endl;
32 cout<<sizeof(q1)<<endl;
33 cout<<sizeof(q2)<<endl;
34 cout<<sizeof(q3)<<endl;
35 cout<<sizeof(A)<<endl;
36 cout<<sizeof(B)<<endl;
37 cout<<sizeof(str1)<<endl;
38 cout<<sizeof(str2)<<endl;
39 }
2 #include<stdio.h>
3 #include<string.h>
4 using namespace std;
5 struct
6 {
7 short a1;
8 short a2;
9 short a3;
10 }A;
11 struct
12 {
13 long a1;
14 short a2;
15
16 }B;
17 main()
18 {
19 char *ss1="0123456789";
20 char ss2[]="0123456789";
21 char ss3[100]="0123456789";
22 int ss4[100];
23 char q1[]="abc";
24 char q2[]="a\n";
25 char *q3="a\n";
26 char *str1=(char *)malloc(100);
27 void *str2=(void *)malloc(100);
28 cout<<sizeof(ss1)<<endl;
29 cout<<sizeof(ss2)<<endl;
30 cout<<sizeof(ss3)<<endl;
31 cout<<sizeof(ss4)<<endl;
32 cout<<sizeof(q1)<<endl;
33 cout<<sizeof(q2)<<endl;
34 cout<<sizeof(q3)<<endl;
35 cout<<sizeof(A)<<endl;
36 cout<<sizeof(B)<<endl;
37 cout<<sizeof(str1)<<endl;
38 cout<<sizeof(str2)<<endl;
39 }
1、ss1是一个字符指针,指针的大小是一个定值,就是4,所以sizeof(ss1)是4
2、ss2是一个字符数组,这个数组最初未定大小,由具体填充值来定。1个字符所占空间是1位,10个就是10位,再加上隐含的"\0",所以一共是11位。
3、ss3也是一个字符数组,这个数组开始预分配100,所以一共是100位。
4、ss4是一个整形数组,每个整形变量所占空间是4,所以一共400位。
5、同2
6、q2里面有一个"\n","\n"算做一位,所以它的空间大小是3。
7、q3是一个字符指针,指针的大小是一个定值,就是4。
8、在默认情况下,为了方便对结构体内元素的访问和管理,当结构体内的元素的长度都小于处理器的位数的时候,便以结构体里面最长的数据元素为对齐单位,也就是说,结构体的长度一定是最长的数据元素的整数倍。如果结构体内存在长度大于处理器位数的元素,那么就以处理器的位数为对齐单位。
A中3个short类型变量都是以2字节对齐,结构体参数按默认的8字节对齐,则a1,a2,a3都取2字节对齐,sizeof(A)为6,其也是2的整数倍。
B中a1为4字节对齐,a2取2字节对齐,结构体大小6字节,6不为4的整数倍,补空字节,增到8时,符合所有条件,则sizeof(B)为8.