Intel和微软同时出现的C语言面试题 Y2H-D{a27
#pragma pack(8) 0t <nH%N}^
N^Re
struct s1{ '/W$9jm
short a; 8|a./%gixs
long b; 3A7774n=P
}; C 0w+
j
TQa}Ps
struct s2{ #oUNF0L@6
char c; VeoG[Jl
s1 d; zCx4DN`
long long e; 4<efj
}; `Fy-"Uf
xnP!P2
#pragma pack() ^jdU4
ag=d6q
问 t'qYM5
1.sizeof(s2) = ? Jz@~$L
2.s2的s1中的a后面空了几个字节接着是b? ?8b19DMK6
!|cg=
yeo&Qz2vU
P?54"$b
如果您知道答案请在讨论中写出,以下是部份网友的答案,供参考: c`a(
G.W !
网友rwxybh(行云)的答案: 2QfN.<[-
内存布局是 drq3=2
1*** 11** ]R__$fl`8
1111 **** )pnyVTKt
1111 1111 +&EXTZ@o
FfoOJzf~o
所以答案就是24和3 zsFzg.$3&
;XKe$fsa~?
下面是一个测试的程序,试一试就知道了,我用的是VC2005 mB?x_6#d9
.fA*WQ!lb
#pragma pack(8) %oZ:Awx
#+I'V\[
struct s1{ kxn&f(5
short a; // 2 BYtes \CbJU
long b; // 4 Bytes UtZ,q!sg
}; j)A#}4jd
struct s2{ {1W:@6tl
char c; // 1 Byte ccD+AGM.
s1 d; // 8 Bytes W yL+HB}
long long e; // 8 Bytes Fnw:alWr
}; dAo;y.3
// 1*** 11** Rj8%% G-pt
// 1111 **** k+3qX'fd
// 1111 1111 8%?y)K^
D
// rqdwQ
\@LTXH.
// 00 01 02 03 04 05 06 07 ~wc:/UM|
// 00 01 02 03 04 05 06 07 uV/5f#)
// 00 01 02 03 04 05 06 07 JxAQ,oOO
// GD
W@/oQr
#pragma pack() 'rQ"Dc1D
$pGT1oF[E
int main(int argc, char* argv[]) f:T?oR>2
{ % RSZ.
s2 a; KyvZ?R
char *p = (char *)&a; Tb/TP3N
for(int i=0;i<24;++i) TkbaoD
p = (char)(i%8); I[\~pi,
printf("%d\n",sizeof(a)); UM}u(;oo%)
printf("c=0x%lx\n",a.c); eI
#Gx_mg
printf("d.a=0x%x\n",a.d.a); APQq F/
printf("d.b=0x%x\n",a.d.b); =OVDJ0ozZ
printf("e=0x%llx\n",a.e); 8)i""OD@I
return 0; g?C;b>4
} Jd2.j?P=
结果: s27IeF3
24 r~w.J+W
c=0x0 39pG-otJ
d.a=0x504 L*nK>
+
d.b=0x3020100 k;WD[SV
e=0x706050403020100 /?\3%<vn
G
dgL}"*F
2z.ot'
网友 redleaves (ID最吊的网友)的答案和分析: Hvl
n>x@
Wboh2:TH:
如果代码:
{pzj@b 1S
#pragma pack(8) 0c_xPBbB+
struct S1{ W:w~ M'o
char a; s}D>.9
long b; {h<D/:^v
}; @[$_cGR7
struct S2 { yU$MB,1
char c; vdQoJWuB
struct S1 d; S}m_XR]
long long e; OMGggg
}; G=dzP}B'WA
#pragma pack() 5En6f`nR{
sizeof(S2)结果为24. 0}{xH
成员对齐有一个重要的条件,即每个成员分别对齐.即每个成员按自己的方式对齐. NE995;
也就是说上面虽然指定了按8字节对齐,但并不是所有的成员都是以8字节对齐.其对齐的规则是,每个成员按其类型的对齐参数(通常是这个类型的大小)和指定对齐参数(这里是8字节)中较小的一个对齐.并且结构的长度必须为所用过的所有对齐参数的整数倍,不够就补空字节. iyskADS
lOIk$"Ne
S1中,成员a是1字节默认按1字节对齐,指定对齐参数为8,这两个值中取1,a按1字节对齐;成员b是4个字节,默认是按4字节对齐,这时就按4字节对齐,所以sizeof(S1)应该为8; >4 OXG7.&f
S2中,c和S1中的a一样,按1字节对齐,而d 是个结构,它是8个字节,它按什么对齐呢?对于结构来说,它的默认对齐方式就是它的所有成员使用的对齐参数中最大的一个,S1的就是4.所以,成员d就是按4字节对齐.成员e是8个字节,它是默认按8字节对齐,和指定的一样,所以它对到8字节的边界上,这时,已经使用了12个字节了,所以又添加了4个字节的空,从第16个字节开始放置成员e.这时,长度为24,已经可以被8(成员e按8字节对齐)整除.这样,一共使用了24个字节. ao(T81
a b ~MpikBf
S1的内存布局:11**,1111, %|Ps|iV
c S1.a S1.b d k3\N.@\
S2的内存布局:1***,11**,1111,****11111111 D}-.<
XQ}Zr/f6
这里有三点很重要: =;}W)V|X)S
1.每个成员分别按自己的方式对齐,并能最小化长度 |(7}0]BP0
2.复杂类型(如结构)的默认对齐方式是它最长的成员的对齐方式,这样在成员是复杂类型时,可以最小化长度 xQy,1f3s+
3.对齐后的长度必须是成员中最大的对齐参数的整数倍,这样在处理数组时可以保证每一项都边界对齐 tAX*CMW
'J|2c;M\x
%+7]/_JO&