Intel和微软同时出现的C语言面试题 Pf,S`Uw;
#pragma pack(8) bz5",8Mn
S%+,:kq
struct s1{ ,K4*0!TXP
short a; `"~s<+
long b; )D_ZZPq_
}; 1$S;#9PQ
h M{&if
struct s2{ ~{69&T}9
char c; Arvxl(R\4
s1 d; 5WhR|
long long e; "p]F q,
}; +!_?f'kv`
0u0<)gdX
#pragma pack() r=57,P(:Ca
jvfVB'Tmr
问 ?}f+PP,
1.sizeof(s2) = ? 2hB';Dv
2.s2的s1中的a后面空了几个字节接着是b? O5}/OH|j
+Smt8O<N
Q2^~^'Yk
YA(_*h
如果您知道答案请在讨论中写出,以下是部份网友的答案,供参考: e|Ip7`
"F_o%!l
网友rwxybh(行云)的答案: z3F ^OU
内存布局是 dFdll3bC
1*** 11** !r=^aa(\
1111 **** X`xI~&t_
1111 1111 Z)iRc$;
r]! <iw
所以答案就是24和3 7\ .Ax
[h"#Gwb=;
下面是一个测试的程序,试一试就知道了,我用的是VC2005 >Hh8K<@NL
E>_?9~8Mf
#pragma pack(8) mX@Un9k
*7`N^e
struct s1{ @3D8TPH
short a; // 2 BYtes e[`E-br^
long b; // 4 Bytes &uLxAw
}; !AR$JUnX
struct s2{ 6Mpbmfr
char c; // 1 Byte C):RE<X
s1 d; // 8 Bytes B_f0-nKP
long long e; // 8 Bytes m>po+7"b
}; M~&|-Hm
// 1*** 11** #3uBq(-Z
// 1111 **** {HgW9N(
// 1111 1111 re.%$D@
// ]U :1NC"
p(2j7W-/
// 00 01 02 03 04 05 06 07 "|1MJuY_6
// 00 01 02 03 04 05 06 07 6k#H>zY,
// 00 01 02 03 04 05 06 07 7e,<$PH
// #xWC(*Ggp
#pragma pack() $Cu/!GA4.>
+n1jP<[<N
int main(int argc, char* argv[]) ^iaeY
jI
{ vBUl6EmWu
s2 a; 9JF*xXd>Q
char *p = (char *)&a; P\ yt!S2
for(int i=0;i<24;++i) FV[6">;g
p = (char)(i%8); nMU#g])y)
printf("%d\n",sizeof(a)); 3t(8uG<rL
printf("c=0x%lx\n",a.c); 47Y|1
printf("d.a=0x%x\n",a.d.a); *
*?mZtF
printf("d.b=0x%x\n",a.d.b); (wJtEoB9^
printf("e=0x%llx\n",a.e); ;OYwZ
return 0; lYd#pNN
} kndP?#>
p1
结果: h6*=Fn7C
24 T[$Sbz`
c=0x0 Z$R2Z$f
d.a=0x504 {HqwpB\@
d.b=0x3020100 h;vD"!gP
e=0x706050403020100 ?Az pb}#
(vIrXF5Dnj
&`rV{%N"
网友 redleaves (ID最吊的网友)的答案和分析: nsyg>=j
v{rc5 ]\R
如果代码: "?j|;p@!>
#pragma pack(8) :oB4\/(G#
struct S1{ V07x+ovq
char a; V:42\b7x
long b; $XS0:C0
}; @4:cn
struct S2 { uTJi }4cw
char c; D#%J||
struct S1 d; ?o0#h
long long e; dRZor gar
}; < %Qw
dEO
#pragma pack() > qA5
sizeof(S2)结果为24. i_GE9A=h
成员对齐有一个重要的条件,即每个成员分别对齐.即每个成员按自己的方式对齐. 1{ #Xa=
也就是说上面虽然指定了按8字节对齐,但并不是所有的成员都是以8字节对齐.其对齐的规则是,每个成员按其类型的对齐参数(通常是这个类型的大小)和指定对齐参数(这里是8字节)中较小的一个对齐.并且结构的长度必须为所用过的所有对齐参数的整数倍,不够就补空字节. !2x"'o
Q6S[sTKR
S1中,成员a是1字节默认按1字节对齐,指定对齐参数为8,这两个值中取1,a按1字节对齐;成员b是4个字节,默认是按4字节对齐,这时就按4字节对齐,所以sizeof(S1)应该为8; GS{:7%=j
S2中,c和S1中的a一样,按1字节对齐,而d 是个结构,它是8个字节,它按什么对齐呢?对于结构来说,它的默认对齐方式就是它的所有成员使用的对齐参数中最大的一个,S1的就是4.所以,成员d就是按4字节对齐.成员e是8个字节,它是默认按8字节对齐,和指定的一样,所以它对到8字节的边界上,这时,已经使用了12个字节了,所以又添加了4个字节的空,从第16个字节开始放置成员e.这时,长度为24,已经可以被8(成员e按8字节对齐)整除.这样,一共使用了24个字节. 6RZ[X[R[}
a b v)JQb-<
S1的内存布局:11**,1111, \h^bOxh
c S1.a S1.b d :C42yQAP
S2的内存布局:1***,11**,1111,****11111111 &Q