Intel和微软同时出现的C语言面试题 |Gx-c
,{{
#pragma pack(8) kO{A]LnAH
OBqaf
)W
struct s1{ 1Jg&L~Ws"
short a; dYrw&gn
long b; `wj<d>m
}; \b95CU
ekND>Qjj
struct s2{ : KhAf2A
char c; l
tE`
s1 d; [~m@'/
long long e; as=Z_a:0N
}; 9gVu:o 1/
Au<NUc
2
#pragma pack() L'B=
=#
]&w8"q
问 ;|*o^9q
1.sizeof(s2) = ? \=Rw/[lR
2.s2的s1中的a后面空了几个字节接着是b? ad+@2-Y
))- B`vi
'=C)Hj[D
}G}2Y (
如果您知道答案请在讨论中写出,以下是部份网友的答案,供参考: )65 o
I!>pHF4
网友rwxybh(行云)的答案: !E">r
内存布局是 mX66}s}#
1*** 11** V<:scLm#OF
1111 **** ;}"!|
1111 1111 =kFZ2/P2t(
8-]\C
所以答案就是24和3 S bI7<_
t M?3oO
下面是一个测试的程序,试一试就知道了,我用的是VC2005 qM%l
z0|%h?N
#pragma pack(8) P(AcDG6K
6?\X)qBI
struct s1{ s\&qvL1D
short a; // 2 BYtes (jhDO7
long b; // 4 Bytes H{qQ8j)
}; **p|g<wvY*
struct s2{ ${ fJ]
char c; // 1 Byte [C_Dv-d
s1 d; // 8 Bytes =, kH(rp2
long long e; // 8 Bytes /WqiGkHV*
}; <E/"v
// 1*** 11** 6[wAX
// 1111 **** >Z%qkU/
// 1111 1111 (.[HE
~ s?
// 3s25Rps
!| ObNS
// 00 01 02 03 04 05 06 07 o +-G@16
// 00 01 02 03 04 05 06 07 =XAFW
// 00 01 02 03 04 05 06 07 e:2e5gz
// 3hUU$|^4gm
#pragma pack() 1=NP=ZB
U42B(ow
int main(int argc, char* argv[]) XQW9/AzN f
{ DX|yL!4[
s2 a; 8":O\^i
char *p = (char *)&a; oY;=$8y<q
for(int i=0;i<24;++i) 2o5Pbdel
p = (char)(i%8); a[).'$S}'
printf("%d\n",sizeof(a)); d9bc>5%-F
printf("c=0x%lx\n",a.c); &v}c3wL]
printf("d.a=0x%x\n",a.d.a); U_\3preF
printf("d.b=0x%x\n",a.d.b); R>|)-"b( `
printf("e=0x%llx\n",a.e); `)Z+]5:
return 0; 0xZX%2E
} #}y(D{z c
结果: \~ACWF7l
24 ~:PuKx
c=0x0 -XcX1_
d.a=0x504 j)A$%xUo
d.b=0x3020100 e3YdHp
e=0x706050403020100 s"jNS1B
85fv] )\y
ccCe@1RI
网友 redleaves (ID最吊的网友)的答案和分析: HW,2x} [
uW@o,S0:
如果代码: *Y!c6eA
#pragma pack(8) t93iU?Z
struct S1{ 97XGJ1HI
char a; B%~D`[~?
long b; qjc8 $#zXS
}; jjbw+
struct S2 { ,?zIt6Z
char c; hp:8e@
struct S1 d; LEM^8G]O
long long e; Gb?O-z%8*
}; JE[+
#pragma pack() E\ 'X|/$a
sizeof(S2)结果为24. P#8]m(
成员对齐有一个重要的条件,即每个成员分别对齐.即每个成员按自己的方式对齐. Vv]81y15Q;
也就是说上面虽然指定了按8字节对齐,但并不是所有的成员都是以8字节对齐.其对齐的规则是,每个成员按其类型的对齐参数(通常是这个类型的大小)和指定对齐参数(这里是8字节)中较小的一个对齐.并且结构的长度必须为所用过的所有对齐参数的整数倍,不够就补空字节. }'o[6#_*X
`U~Y{f_!H
S1中,成员a是1字节默认按1字节对齐,指定对齐参数为8,这两个值中取1,a按1字节对齐;成员b是4个字节,默认是按4字节对齐,这时就按4字节对齐,所以sizeof(S1)应该为8; +ISXyGu
S2中,c和S1中的a一样,按1字节对齐,而d 是个结构,它是8个字节,它按什么对齐呢?对于结构来说,它的默认对齐方式就是它的所有成员使用的对齐参数中最大的一个,S1的就是4.所以,成员d就是按4字节对齐.成员e是8个字节,它是默认按8字节对齐,和指定的一样,所以它对到8字节的边界上,这时,已经使用了12个字节了,所以又添加了4个字节的空,从第16个字节开始放置成员e.这时,长度为24,已经可以被8(成员e按8字节对齐)整除.这样,一共使用了24个字节.
`LWZ!Q
a b e.Y*=P}D
S1的内存布局:11**,1111, G0u3*.
c S1.a S1.b d 9Ytd E*,k
S2的内存布局:1***,11**,1111,****11111111 cdH Ug#
I,0]> kx
这里有三点很重要: |H(Mmqgk
1.每个成员分别按自己的方式对齐,并能最小化长度 /p&)bL
2.复杂类型(如结构)的默认对齐方式是它最长的成员的对齐方式,这样在成员是复杂类型时,可以最小化长度 $!msav
3.对齐后的长度必须是成员中最大的对齐参数的整数倍,这样在处理数组时可以保证每一项都边界对齐 guD?~-Q
INHN=KY{
Q I.*6-(
网友xue23(xue23) 的答案和分析: _z3Hl?qk=
Vu6pl
有程序查一下各个变量的内存地址得知: <_|H]^o
各个变量在内存中的位置为 v7l4g&