下面代码输出结果是什么?
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): 400sizeof(q1): 4
sizeof(q2): 3
sizeof(q3): 4sizeof(A): 6
sizeof(B): 8
sizeof(str1): 4
sizeof(str2): 4