Intel和微软同时出现的C语言面试题 st-{xC#N#
#pragma pack(8) lSxb:$g
Br1R++]
struct s1{ T[oC='I+O
short a; u#0snw~)/
long b; ]}2)U
}; w0Qtr>"
,;k+n)
struct s2{ osW"wh_
char c; O)'CU1vMb
s1 d; )(iv#;ByL
long long e; g`XngRb|j
}; W }NUU
{{G)Ry*pb
#pragma pack() H>~ CL
7sot?gF
问 jLAEHEs
1.sizeof(s2) = ? z0z@LA4k6@
2.s2的s1中的a后面空了几个字节接着是b? Qb536RpcTY
E&M(QX5
-+R,="nRQ
vObZ|>.J~O
如果您知道答案请在讨论中写出,以下是部份网友的答案,供参考: MmF&jd-=
70'OS:J=\
网友rwxybh(行云)的答案: B*,6;lCjX
内存布局是 AO#9XDEM
1*** 11** YpZB-9Krf
1111 **** PX:#+bq1
1111 1111 ;Qi:j^+P)
=pH2V^<<#
所以答案就是24和3 DIC*{aBf
a<cwrDZ
下面是一个测试的程序,试一试就知道了,我用的是VC2005 amBg<P`'_
Cf%
qap#
#pragma pack(8) 7=^{~5#
&g`IRz
struct s1{ .u-a+ac<
short a; // 2 BYtes f ,F X# _4
long b; // 4 Bytes mZ)>^.N6
}; }EK{UM9y
struct s2{ <,i4Ua
char c; // 1 Byte 5'2kP{;
s1 d; // 8 Bytes RSX27fb4
long long e; // 8 Bytes 9YzV48su#
}; #;[G>-tC
// 1*** 11** H 4<"+7
// 1111 **** @N*|w
Kc+
// 1111 1111 TnrBHaxbo4
// ;mQj2Bwr
A5<t> 6Y
// 00 01 02 03 04 05 06 07 _CwTe=K}
// 00 01 02 03 04 05 06 07 at uqo3
// 00 01 02 03 04 05 06 07 4~fYG| a
// K<S3gb?0
#pragma pack() n`Q@<op
K;F1'5+=D
int main(int argc, char* argv[]) 01cBAu
{ Q\Ek U.[I
s2 a; SUS=sR/N
char *p = (char *)&a; fG0 ?"x@>
for(int i=0;i<24;++i) gZ @+62
p = (char)(i%8); RGW@@
printf("%d\n",sizeof(a)); 4cjfn'x
printf("c=0x%lx\n",a.c); fdl.3~.C
printf("d.a=0x%x\n",a.d.a); c(Q@5@1y:
printf("d.b=0x%x\n",a.d.b); dC C*|b8h
printf("e=0x%llx\n",a.e); &
3#7>oQ
return 0; v$ ti=uk$
} m2]N%Y
结果: o[Iu9.zJpy
24 f{BF%;
c=0x0 n0(Q/
d.a=0x504 f%G\'q]#F
d.b=0x3020100 u`MMK4 %
e=0x706050403020100 hD6BP
pH'_k k
^<I(
网友 redleaves (ID最吊的网友)的答案和分析: >pq~ &)^u
@16GF!.
如果代码: rN0<y4)!
#pragma pack(8) tv#oEM9esl
struct S1{ qTsy'y;Z
char a; U1\7Hcs$
long b; +kSu{Tc
}; lM-9 J?j
struct S2 { rT2Njy1
char c; =?5)M_6)
struct S1 d; FnvpnU",
long long e; GJ9>i)+h;
}; zWY988fX0
#pragma pack() 0Lo8pe`DH
sizeof(S2)结果为24. .NOAp
成员对齐有一个重要的条件,即每个成员分别对齐.即每个成员按自己的方式对齐. HTQZIm
也就是说上面虽然指定了按8字节对齐,但并不是所有的成员都是以8字节对齐.其对齐的规则是,每个成员按其类型的对齐参数(通常是这个类型的大小)和指定对齐参数(这里是8字节)中较小的一个对齐.并且结构的长度必须为所用过的所有对齐参数的整数倍,不够就补空字节. -WC0W
j|!,^._i
S1中,成员a是1字节默认按1字节对齐,指定对齐参数为8,这两个值中取1,a按1字节对齐;成员b是4个字节,默认是按4字节对齐,这时就按4字节对齐,所以sizeof(S1)应该为8; 4BCPh:
S2中,c和S1中的a一样,按1字节对齐,而d 是个结构,它是8个字节,它按什么对齐呢?对于结构来说,它的默认对齐方式就是它的所有成员使用的对齐参数中最大的一个,S1的就是4.所以,成员d就是按4字节对齐.成员e是8个字节,它是默认按8字节对齐,和指定的一样,所以它对到8字节的边界上,这时,已经使用了12个字节了,所以又添加了4个字节的空,从第16个字节开始放置成员e.这时,长度为24,已经可以被8(成员e按8字节对齐)整除.这样,一共使用了24个字节. aODh5
a b pz%s_g'
S1的内存布局:11**,1111, Af3|l
c S1.a S1.b d TgiZ
% G
S2的内存布局:1***,11**,1111,****11111111 cBxGGggB
O<S.fr,
这里有三点很重要: #&Hi0..y
1.每个成员分别按自己的方式对齐,并能最小化长度 2B_|"J
2.复杂类型(如结构)的默认对齐方式是它最长的成员的对齐方式,这样在成员是复杂类型时,可以最小化长度 t2[/eM.G
3.对齐后的长度必须是成员中最大的对齐参数的整数倍,这样在处理数组时可以保证每一项都边界对齐 vJWBr:`L
JR!-1tnc
jTa\I&s