Intel和微软同时出现的C语言面试题 ebhXak[w
#pragma pack(8) i&fuSk EP
9W5lSX#^;
struct s1{ <'Eme
short a; T?0eVvM
long b; c)85=T6*aA
}; (%6P0*
9$w.9`Py
struct s2{ 5C]x!>kX
char c; ;[DU%f
s1 d; !f[_+CD
long long e; q?yVR3]M
}; /{_:{G!Q0
hn@08t G
#pragma pack() "(O>=F&
/,yd+wcW#
问 Dz/ "M=
1.sizeof(s2) = ? 7n<{tM
2.s2的s1中的a后面空了几个字节接着是b? J/$&NWF
7JH6A'&
_V6ukd"B~
C,r;VyW6BI
如果您知道答案请在讨论中写出,以下是部份网友的答案,供参考: rM%1GPVob
$6 f3F?y7
网友rwxybh(行云)的答案: H7n>Vx:L-
内存布局是 ;)*eo_tQ
1*** 11** rb.N~
1111 **** !F$6-0%
1111 1111 Ti5-6%~&
1Pu~X
\sO
所以答案就是24和3 8nV+e~-w
24eLB?H
下面是一个测试的程序,试一试就知道了,我用的是VC2005 d$!RZHo10V
73;GW4,
#pragma pack(8) *GPiOA
a
)ez9"# MH'
struct s1{ >y3=|
short a; // 2 BYtes 0GeTSFj
long b; // 4 Bytes kl:Bfs)b
}; onzxx4bax
struct s2{ #"~<HG}bR/
char c; // 1 Byte ;e *!S}C,
s1 d; // 8 Bytes q_58;Bv
long long e; // 8 Bytes q/,O\,
}; Q![@c
// 1*** 11** ~]2K^bh8&
// 1111 **** sXPe/fWo
// 1111 1111 26h21Z16q
// 7kEn \
4kx
N<]
// 00 01 02 03 04 05 06 07 FZnw0tMq
// 00 01 02 03 04 05 06 07 &^jXEz;
// 00 01 02 03 04 05 06 07 L!xi
// KZf+MSq?
B
#pragma pack() bk[!8-b/a
;4\;mmLVk
int main(int argc, char* argv[]) ww1[rCh\+
{ K$=zi}J W
s2 a; wibNQ`4k
char *p = (char *)&a; D&y7-/
for(int i=0;i<24;++i) 0g8NHkM:2a
p = (char)(i%8); &};zvo~P.
printf("%d\n",sizeof(a)); +ZP7{%
printf("c=0x%lx\n",a.c); "w<#^d_6
printf("d.a=0x%x\n",a.d.a); W"{N Bi
printf("d.b=0x%x\n",a.d.b); BI@[\aRLQ
printf("e=0x%llx\n",a.e); CrTw@AW9)
return 0; $XH^~i;
} %xLhZ\
结果: ~k5W@`"W
24 $6IJP\
c=0x0
[$UI8tV
d.a=0x504 fk-RV>yr
d.b=0x3020100 JBZ@'8eqi]
e=0x706050403020100 d<Tc7vg4|U
m1A J{cs
jL}v9$
网友 redleaves (ID最吊的网友)的答案和分析: aN3;`~{9
]Hv[ IodJ
如果代码: owv[M6lbD
#pragma pack(8) jebx40TA3
struct S1{ Tid a a
char a; >9J:Uo1z
long b; rytyw77t(
}; MolgwVd
struct S2 { )V9bI( v
char c; N'=gep0V@
struct S1 d; d0>
zS
long long e; A3*!"3nU
}; 2X&qE}%k S
#pragma pack() |y!A&d=xYn
sizeof(S2)结果为24. q5S9C%b
成员对齐有一个重要的条件,即每个成员分别对齐.即每个成员按自己的方式对齐. xgtR6E^k
也就是说上面虽然指定了按8字节对齐,但并不是所有的成员都是以8字节对齐.其对齐的规则是,每个成员按其类型的对齐参数(通常是这个类型的大小)和指定对齐参数(这里是8字节)中较小的一个对齐.并且结构的长度必须为所用过的所有对齐参数的整数倍,不够就补空字节. Eh4=ZEX
3Zh)]^
S1中,成员a是1字节默认按1字节对齐,指定对齐参数为8,这两个值中取1,a按1字节对齐;成员b是4个字节,默认是按4字节对齐,这时就按4字节对齐,所以sizeof(S1)应该为8; ;dhQN}7
S2中,c和S1中的a一样,按1字节对齐,而d 是个结构,它是8个字节,它按什么对齐呢?对于结构来说,它的默认对齐方式就是它的所有成员使用的对齐参数中最大的一个,S1的就是4.所以,成员d就是按4字节对齐.成员e是8个字节,它是默认按8字节对齐,和指定的一样,所以它对到8字节的边界上,这时,已经使用了12个字节了,所以又添加了4个字节的空,从第16个字节开始放置成员e.这时,长度为24,已经可以被8(成员e按8字节对齐)整除.这样,一共使用了24个字节. <#HYqR',
a b =2x^nW
S1的内存布局:11**,1111, 0{SL&<&