sizeof

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 }

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.

原文地址:https://www.cnblogs.com/anderson0/p/1849223.html