C SIZEOF

下面代码输出结果是什么?

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include<iostream>
using  namespace  std;
 
struct
{
     short  a1;
     short  a2;
     short  a3;
}A;
 
struct
{
     long  a1;
     short  a2;
}B;
 
int  main ()
{
     char * ss1 = "0123456789" ;
     char  ss2[] = "0123456789" ;
     char  ss3[100] = "0123456789" ;
     int  ss4[100];
     char  q1[] = "abc" ;
     char  q2[] = "a\n" ;
     char * q3 = "a\n" ;
     char  *str1 = ( char  *) malloc (100);
     void  *str2 = ( void  *) malloc (100);
 
     cout<< "sizeof(ss1):" << sizeof (ss1)<<endl;
     cout<< "sizeof(ss2):" << sizeof (ss2)<<endl;
     cout<< "sizeof(ss3):" << sizeof (ss3)<<endl;
     cout<< "sizeof(ss4):" << sizeof (ss4)<<endl;
     cout<< "sizeof(q1):" << sizeof (q1)<<endl;
     cout<< "sizeof(q2):" << sizeof (q2)<<endl;
     cout<< "sizeof(q3):" << sizeof (q3)<<endl;
     cout<< "sizeof(A):" << sizeof (A)<<endl;
     cout<< "sizeof(B):" << sizeof (B)<<endl;
     cout<< "sizeof(str1):" << sizeof (str1)<<endl;
     cout<< "sizeof(str2):" << sizeof (str2)<<endl;
 
     return  0;
}

解析:ss1是一个字符指针,指针的大小是一个定值,就是4字节,所以sizeof(ss1)是4字节

ss2是一个字符数组,这个数组最初未定大小,由具体填充值来定。填充值是“0123456789 ”。1个字符所占空间是1字节,10个就是10字节,再加上隐含的“\0”,所以一共是11字节。

ss3也是一个字符数组,这个数组开始预分配100,所以它的大小一共是100字节。

ss4也是一个字符数组,这个数组开始预分配100,但是每个整型变量所占用空间是4,所以它的大小一共是400字节。

q1与ss2类似,所以是4字节。

q2里面有一个“\n”,“\n”算做一位,所以它的空间大小是3字节。

q3是一个字符指针,指针的大小是一个定值,就是4,所以sizeof(q3)是4字节。

A和B是两个结构体,在默认情况下,为了方便对结构体内元素的访问和管理,当结构体内的元素的长度都小于处理器的位数的时候,便以结构体里面最长的数据元素为对齐单位,也就是说,结构体的长度一定是最长的数据元素的整数倍。如果结构体内存在长度大于处理器位数的元素,那么就以处理器的位数为对齐单位,但是结构体内类型相同的连续元素将在连续的空间内,和数组一样。

结构体A中有3个short类型变量,各自以2个字节对齐,所以sizeof(A)是为6字节。结构体B中a1以4字节对齐,a2以2字节对齐,则结构体大小为6字节,但是结构体的长度一定是最长数据元素的整数倍,显然6不是4的整数倍数,补空字节,增到8字节,符合所以条件。故sizeof(B)为8字节。

str1和str2都是字符指针,都是4字节。

答案:

sizeof(ss1):  4

sizeof(ss2):  11 
sizeof(ss3):  100 
sizeof(ss4):  400

sizeof(q1):   4

sizeof(q2):  3 
sizeof(q3):  4

sizeof(A):  6

sizeof(B):  8

sizeof(str1):  4 
sizeof(str2):  4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值