Intel和微软同时出现的C语言面试题 wQw&.)T
#pragma pack(8) qA>C<NL
=IEei{
struct s1{ (yO8G-Z0
short a; /oC@:7
long b; bH`r=@.:cu
};
`)n/J+g
,sZ)@?e
struct s2{ AYHefAF<w
char c; q Oyo+hu
s1 d; shuoEeoo
long long e; !.cno&
}; J/>9w
$*qQ/hi
#pragma pack() ojbms>a
K06x7W
问 %(ms74R+
1.sizeof(s2) = ? 2*pNIc
2.s2的s1中的a后面空了几个字节接着是b? Lgrpy
Xmv^O
LA4,o@V`
PM8*/4Cu.5
如果您知道答案请在讨论中写出,以下是部份网友的答案,供参考: `%$l
b:e
z|v/hUrD
网友rwxybh(行云)的答案: xz*MFoE
内存布局是 /|WBk}
1*** 11** Noi+mL
1111 **** !)HB+yr
1111 1111 bOdQ+Y6
Jl-:@[;
所以答案就是24和3 ,r,$x4*
;dquld+q
下面是一个测试的程序,试一试就知道了,我用的是VC2005 }~!KjFbs
k. ?@qCs[
#pragma pack(8) qt=nN-AC(
b0aV?A}th
struct s1{ EncJB
short a; // 2 BYtes [?S-on.
long b; // 4 Bytes I.{%e;Reg
}; q 1~3T;Il
struct s2{ k*|WI$
char c; // 1 Byte xF8 8'p'
s1 d; // 8 Bytes :89AYqT"
long long e; // 8 Bytes Rd,5&X$
}; ^+u/Lw&
// 1*** 11** UhbGU G
// 1111 **** 1JY3c
M
// 1111 1111 UUR` m
// +qee8QH
5K {{o''
// 00 01 02 03 04 05 06 07 {(_>A\zi
// 00 01 02 03 04 05 06 07 5uO.@0
// 00 01 02 03 04 05 06 07 ]}d.h!`<)
// k[8{N
#pragma pack() C7_nA:Rc
|`Q2K9'4bL
int main(int argc, char* argv[]) dH~i
{ [w?v !8l
s2 a; Y~P*
!g
char *p = (char *)&a; "#=WD
for(int i=0;i<24;++i) IaYaIEL-
p = (char)(i%8); gn6 @x
printf("%d\n",sizeof(a)); C
o,"
printf("c=0x%lx\n",a.c); mu@IcIb>
printf("d.a=0x%x\n",a.d.a); AR6hfdDDT
printf("d.b=0x%x\n",a.d.b); JqP~2,T
printf("e=0x%llx\n",a.e); W+ v#m>G
return 0; U$EQeb
} E#(dri*#t
结果: .Gn-`
24 I0v4TjHH
c=0x0 UY/qI%#L#,
d.a=0x504 FV5~sy
d.b=0x3020100 2i~zAD'
e=0x706050403020100 N&]_U%#Q
+J
<<me4
4C`p`AQqpQ
网友 redleaves (ID最吊的网友)的答案和分析: DNGj8 1'c
x?n13C
如果代码: KpfQ=~'
#pragma pack(8) +.IncY8C$
struct S1{ @9\L|O'~?
char a; f6JC>Np
long b;
k'PN fx\K
}; b
=R9@!
struct S2 { K yDPD'
char c; yN9setw*,M
struct S1 d; a"whg~
long long e; DUWSY?^c
}; ;]Ko7M(4
#pragma pack() ;\rKkH"K8n
sizeof(S2)结果为24. hg+0!DVx
成员对齐有一个重要的条件,即每个成员分别对齐.即每个成员按自己的方式对齐. }=
(|3\v
也就是说上面虽然指定了按8字节对齐,但并不是所有的成员都是以8字节对齐.其对齐的规则是,每个成员按其类型的对齐参数(通常是这个类型的大小)和指定对齐参数(这里是8字节)中较小的一个对齐.并且结构的长度必须为所用过的所有对齐参数的整数倍,不够就补空字节. \>)#cEX5
cp L '
S1中,成员a是1字节默认按1字节对齐,指定对齐参数为8,这两个值中取1,a按1字节对齐;成员b是4个字节,默认是按4字节对齐,这时就按4字节对齐,所以sizeof(S1)应该为8; K%(DRkj)
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?"s6L3
a b Tu7sA.73k
S1的内存布局:11**,1111, -(l/.yE{X
c S1.a S1.b d p[:E$#W~;
S2的内存布局:1***,11**,1111,****11111111 {/q4W; D
G&d