Intel和微软同时出现的C语言面试题 ^XV=(k;~bX
#pragma pack(8) b ;Vy=f
S >P TD@
struct s1{ Lmy ^/P%
short a; O MEPF2:
long b; H-Uy~Ry*T
}; WH.5vrY Z
ccW z,[
struct s2{ p2|BbC\N
char c; EH'?wh|Yp
s1 d; G?Y2 b
long long e; w%no6 ;
}; f3 lKdXnP
;P-xKRU!Xx
#pragma pack() ^oFg5
KfXE=v{t
问 S.9ki<
1.sizeof(s2) = ? qp-/S^%
2.s2的s1中的a后面空了几个字节接着是b? |(e`V
fz`+j
-u
"tgaFtC=w
a*}ZT,V
如果您知道答案请在讨论中写出,以下是部份网友的答案,供参考: Z=sC YLm
)+[{MR'
网友rwxybh(行云)的答案: NXvu}&H
内存布局是 \ORNOX:
1*** 11** mCtuR*z_
1111 **** 3N?WpA768/
1111 1111 MorR&K
D?u*^?a2
所以答案就是24和3 .)W'{2J-
)fz)Rrr
下面是一个测试的程序,试一试就知道了,我用的是VC2005 SC~cryb
zMT0ToG
#pragma pack(8) 1;p'2-x
Oj#nF@U
struct s1{ Z2Bl$ \
short a; // 2 BYtes a.a5qwG
long b; // 4 Bytes ~M 6^%
}; _LV;q! /j
struct s2{ =Tf
uwhV
char c; // 1 Byte Q(-:)3g[aL
s1 d; // 8 Bytes ^ ~HV`s
long long e; // 8 Bytes [@OXvdTV
}; (hefpqpi
// 1*** 11** %@Nuzdp
// 1111 **** taXS>*|B
// 1111 1111 cvpcadN[
// E3#}:6m
a;eV&~
// 00 01 02 03 04 05 06 07 Kc= &jCn
// 00 01 02 03 04 05 06 07 ~y+QL{P4~
// 00 01 02 03 04 05 06 07 %C%~f{4
// &L,zh{Mp
#pragma pack() f i-E_
r'/7kF- 5
int main(int argc, char* argv[]) b$P=rIB
{ ~_P,z?
s2 a; 7FMg6z8~
char *p = (char *)&a; (( 0%>HJ{~
for(int i=0;i<24;++i) ;T! mNKl
p = (char)(i%8); %+iJpRK)7
printf("%d\n",sizeof(a)); sgDlT=c'
printf("c=0x%lx\n",a.c); 7d?'~}j
printf("d.a=0x%x\n",a.d.a); #/ 1
printf("d.b=0x%x\n",a.d.b); F/[vg
printf("e=0x%llx\n",a.e); Akf?BB3bC
return 0; O $uXQ.r
} B:=*lU.n
结果: q<rB(j-(
24 Ti
}Ljp^O
c=0x0 bWK}oYB*
d.a=0x504 Pew-6u"
d.b=0x3020100 p]uwGWDI
e=0x706050403020100 ir<HC 'D[
]<mXf~zg
dm1WC:b
网友 redleaves (ID最吊的网友)的答案和分析: _eAZ_@
~xqRCf{8
如果代码: le?hCPHkp
#pragma pack(8) xI}h{AF7
struct S1{ n%I%O7
char a; S,LW/:,
long b; ,~t{Q*#_h
}; fr8:L!9
struct S2 { MoN;t;
char c; bZk7)b;1o
struct S1 d; ]sJWiIe.
long long e; ;2
oR?COW
}; r{.DRbn
#pragma pack() Wa%Zt*7
sizeof(S2)结果为24. -tWkN^j8+
成员对齐有一个重要的条件,即每个成员分别对齐.即每个成员按自己的方式对齐. ^1M :wXr
也就是说上面虽然指定了按8字节对齐,但并不是所有的成员都是以8字节对齐.其对齐的规则是,每个成员按其类型的对齐参数(通常是这个类型的大小)和指定对齐参数(这里是8字节)中较小的一个对齐.并且结构的长度必须为所用过的所有对齐参数的整数倍,不够就补空字节. XCO{}wU)>
L2[|g~
S1中,成员a是1字节默认按1字节对齐,指定对齐参数为8,这两个值中取1,a按1字节对齐;成员b是4个字节,默认是按4字节对齐,这时就按4字节对齐,所以sizeof(S1)应该为8; _ 97
S2中,c和S1中的a一样,按1字节对齐,而d 是个结构,它是8个字节,它按什么对齐呢?对于结构来说,它的默认对齐方式就是它的所有成员使用的对齐参数中最大的一个,S1的就是4.所以,成员d就是按4字节对齐.成员e是8个字节,它是默认按8字节对齐,和指定的一样,所以它对到8字节的边界上,这时,已经使用了12个字节了,所以又添加了4个字节的空,从第16个字节开始放置成员e.这时,长度为24,已经可以被8(成员e按8字节对齐)整除.这样,一共使用了24个字节. w?A&X