Intel和微软同时出现的C语言面试题 #Qc[W +%
#pragma pack(8) )7c\wAs
)!hDF9O
struct s1{ d4/snvq
short a; yC4JYF]JN
long b; 3>yb$ZU"-
}; fyT:I6*
2X;,s`)
struct s2{ bV|:MW<Wv
char c; <_8\}!
s1 d; ' ~ lC85
long long e; YN9ug3O+
}; FVT_%"%C9
]pl g@
#pragma pack() T/MbEqAf
KQaw*T[Q3w
问 fyYT #r
1.sizeof(s2) = ? c^}gJ
2.s2的s1中的a后面空了几个字节接着是b? yAG4W[
:)t1>y>3
Qr1%"^4
ny'~pT'00
如果您知道答案请在讨论中写出,以下是部份网友的答案,供参考: .@JXV
$Z
_
mhP:O
网友rwxybh(行云)的答案: jL^zS XQB
内存布局是 6gY5v@!w
1*** 11** rOE[c
1111 **** a "EP `
1111 1111 8#2PJHl;
+dSe"W9
所以答案就是24和3 o~<37J3).
0XSZ3dY&+
下面是一个测试的程序,试一试就知道了,我用的是VC2005 ;n00kel$
EN` --^
#pragma pack(8) QL"fC;xUn,
s{x2RDAt
struct s1{ qxG@Zd
short a; // 2 BYtes m[!t7e
long b; // 4 Bytes Ex^7`-2,B
}; #JYv1F
struct s2{ %L}9nc%~eP
char c; // 1 Byte [?)}0cd0
s1 d; // 8 Bytes 6Y)'p
.+g
long long e; // 8 Bytes [ahD%UxO5
}; K SDo)7`
// 1*** 11** bk}.^m!
// 1111 **** iE':ur<`
// 1111 1111 )}9Ef"v|
// ^,
q\S
L9Z:>i?
// 00 01 02 03 04 05 06 07 L qMH]W
// 00 01 02 03 04 05 06 07 ]MfT5#(6h
// 00 01 02 03 04 05 06 07 PZKKbg2S
// ox{)O/aj
#pragma pack() H5S>|"`e`e
Q*ZqY
int main(int argc, char* argv[]) Z9cch-u~
{ @ T'!;)
s2 a; F4M<5Yi
char *p = (char *)&a; Z 3m5D K
for(int i=0;i<24;++i) `XB(d@%
p = (char)(i%8); *eH[~4
printf("%d\n",sizeof(a)); -i:Zi}f
printf("c=0x%lx\n",a.c); ha1 J^e
printf("d.a=0x%x\n",a.d.a); q!$ZBw-7>A
printf("d.b=0x%x\n",a.d.b); `LVItP(GUM
printf("e=0x%llx\n",a.e); &Zs h-|N
return 0; {vx{Hwyv
} CSRcTxH
结果: z,87;4-
24 }N#jA yp!
c=0x0 s7tNAj bgD
d.a=0x504 15x~[?!
d.b=0x3020100 d2&sl(O
e=0x706050403020100 A 7'dD$9
J)oa:Q
cT`x,2
网友 redleaves (ID最吊的网友)的答案和分析: Yl% Ra1
O`g44LW2n
如果代码: i{I'+%~R
#pragma pack(8) *Tl"~)'t~
struct S1{ zq80}5%2CT
char a; RvZi %)
long b; K%[Rv#>;q|
}; b&"=W9(V
struct S2 { BLgmFE2
char c; Y
6K<e:Y
struct S1 d; B%6>2S=E
long long e; 1?]Gl+}
}; w{?nX6a@p
#pragma pack() Jt43+]
sizeof(S2)结果为24. _Xlf}BE
成员对齐有一个重要的条件,即每个成员分别对齐.即每个成员按自己的方式对齐. xop9*Z$
也就是说上面虽然指定了按8字节对齐,但并不是所有的成员都是以8字节对齐.其对齐的规则是,每个成员按其类型的对齐参数(通常是这个类型的大小)和指定对齐参数(这里是8字节)中较小的一个对齐.并且结构的长度必须为所用过的所有对齐参数的整数倍,不够就补空字节. &dp(CH<De
B#&U5fSw+0
S1中,成员a是1字节默认按1字节对齐,指定对齐参数为8,这两个值中取1,a按1字节对齐;成员b是4个字节,默认是按4字节对齐,这时就按4字节对齐,所以sizeof(S1)应该为8; #
5v 2`|)
S2中,c和S1中的a一样,按1字节对齐,而d 是个结构,它是8个字节,它按什么对齐呢?对于结构来说,它的默认对齐方式就是它的所有成员使用的对齐参数中最大的一个,S1的就是4.所以,成员d就是按4字节对齐.成员e是8个字节,它是默认按8字节对齐,和指定的一样,所以它对到8字节的边界上,这时,已经使用了12个字节了,所以又添加了4个字节的空,从第16个字节开始放置成员e.这时,长度为24,已经可以被8(成员e按8字节对齐)整除.这样,一共使用了24个字节. >(ku*
a b sl}bNzT#
S1的内存布局:11**,1111, Gn<s>3E
c S1.a S1.b d yd]W',c
S2的内存布局:1***,11**,1111,****11111111 R;.zS^LL
sEt5!&