Intel和微软同时出现的C语言面试题 DSj(]U~r
#pragma pack(8) YOJ6w
T t>8?
struct s1{ }E7:ihy
short a; yA3wtm/?
long b; $*W6A/%O
}; Tc+gdo>G
h/,${,}J
struct s2{ .&x}NYX4
char c; {Ixg2=E\
s1 d; U`]T~9I
long long e; raQ7.7
}; gp-T"l
"rAY.E]
#pragma pack() NzW`B^p
/o2P+Xr8"
问 X@|&c]]
1.sizeof(s2) = ? bTSL<"(]N
2.s2的s1中的a后面空了几个字节接着是b? ILic.@st
Gxax2o
> MH(0+B*
^Eo=W/
如果您知道答案请在讨论中写出,以下是部份网友的答案,供参考: v-! u\
Z,X'-7YkU
网友rwxybh(行云)的答案: !(t,FYeH
内存布局是 cGwf!hA
1*** 11** &,.Y9;
b
1111 **** 1+7GUSIb
1111 1111 {W\T"7H
oW;6h.
所以答案就是24和3 BQ jK8c<
v~/~@jv
下面是一个测试的程序,试一试就知道了,我用的是VC2005 _|''{kj(
i7LJ&g/)
#pragma pack(8) AE@NOM7u
7_# 1Ec|;
struct s1{ Y+qQI MZ
short a; // 2 BYtes '>(.%@
long b; // 4 Bytes 1J?dK|% b
}; }!i` 0p
struct s2{ vEG'HOP
char c; // 1 Byte W~Z<1[
s1 d; // 8 Bytes ; <Km3
long long e; // 8 Bytes vOgC>_x7
}; /1`cRyS
// 1*** 11** ]P[%Mhg^
// 1111 **** [= "r<W0
// 1111 1111 k6Cn"2q <
// ]Zf6Yw .Y
(s5<
// 00 01 02 03 04 05 06 07 '.=Wk^,Ua
// 00 01 02 03 04 05 06 07 =X)Q7u".7
// 00 01 02 03 04 05 06 07 q-A`/9
// }DJ|9D^yf
#pragma pack() t|go5DXz4
P'-JbPXU
int main(int argc, char* argv[]) ){+.8KI
{ mrK,Ql
s2 a; "PZYgl
char *p = (char *)&a; IlcNT_
5a8
for(int i=0;i<24;++i) =Jsg{vI
p = (char)(i%8); `Ev A\f
printf("%d\n",sizeof(a)); fO[Rf_
printf("c=0x%lx\n",a.c); #H'sZv
printf("d.a=0x%x\n",a.d.a); %KbBH:z05
printf("d.b=0x%x\n",a.d.b); 6V.awg,
printf("e=0x%llx\n",a.e); 3*CzXK>`M&
return 0; V}vl2o
} R59e&
结果: ~C}(\8g
24 ~a|^?7@p
c=0x0 u@GRN`yn
d.a=0x504 >P<k[vF
d.b=0x3020100 Rel(bA-[N
e=0x706050403020100 }}kS~
w-#
=XZF.ur
?&whE!
网友 redleaves (ID最吊的网友)的答案和分析: _7-"VoX
:pA=V
如果代码: Y|hzF:ll
#pragma pack(8) <7vI h0
struct S1{ ?F?\uC2)'
char a; ZTQ$Ol+{q
long b; w,M1`RsK
}; c7FfI"7HR
struct S2 { ]7#^])>
char c; W+#}~2&Dv
struct S1 d; M3ecIVm8(
long long e; C5:dO\?O
}; "@c';".|
#pragma pack() adRNrt*!
sizeof(S2)结果为24. x?k
成员对齐有一个重要的条件,即每个成员分别对齐.即每个成员按自己的方式对齐. /7UovKKbz
也就是说上面虽然指定了按8字节对齐,但并不是所有的成员都是以8字节对齐.其对齐的规则是,每个成员按其类型的对齐参数(通常是这个类型的大小)和指定对齐参数(这里是8字节)中较小的一个对齐.并且结构的长度必须为所用过的所有对齐参数的整数倍,不够就补空字节. j6&zRFX
?`vM#)
S1中,成员a是1字节默认按1字节对齐,指定对齐参数为8,这两个值中取1,a按1字节对齐;成员b是4个字节,默认是按4字节对齐,这时就按4字节对齐,所以sizeof(S1)应该为8; USnD7I/b
S2中,c和S1中的a一样,按1字节对齐,而d 是个结构,它是8个字节,它按什么对齐呢?对于结构来说,它的默认对齐方式就是它的所有成员使用的对齐参数中最大的一个,S1的就是4.所以,成员d就是按4字节对齐.成员e是8个字节,它是默认按8字节对齐,和指定的一样,所以它对到8字节的边界上,这时,已经使用了12个字节了,所以又添加了4个字节的空,从第16个字节开始放置成员e.这时,长度为24,已经可以被8(成员e按8字节对齐)整除.这样,一共使用了24个字节. *3w/`R<\
a b OH-~
S1的内存布局:11**,1111, C }h<ldlY
c S1.a S1.b d h 7(H%(^_
S2的内存布局:1***,11**,1111,****11111111 f^[{k
{t
=\ti<
这里有三点很重要: \,@Yl.,+
1.每个成员分别按自己的方式对齐,并能最小化长度 ZbZAx:L
2.复杂类型(如结构)的默认对齐方式是它最长的成员的对齐方式,这样在成员是复杂类型时,可以最小化长度 oP|pOs\$p
3.对齐后的长度必须是成员中最大的对齐参数的整数倍,这样在处理数组时可以保证每一项都边界对齐 D]G'R5H
<tu[cA>
94qHY1rp
网友xue23(xue23) 的答案和分析: brYYuN|Vc
J^s<