社区应用 最新帖子 精华区 社区服务 会员列表 统计排行 社区论坛任务 迷你宠物
  • 3417阅读
  • 1回复

Intel和微软同时出现的面试题

级别: 大掌柜
发帖
7343
铜板
6618
人品值
1388
贡献值
28
交易币
100
好评度
7488
信誉值
10
金币
0
所在楼道
学一楼
Intel和微软同时出现的C语言面试题 NVRLrJWpp  
  #pragma pack(8) 3do)Vg4  
Z(Jt~a3o  
  struct s1{ TsTPj8GAl[  
  short a; -lv)tHs<  
  long b; K$d$m <  
  }; hJPlq0C  
QE7V. >J_p  
  struct s2{ c*~]zR>s!  
  char c; bJD;>"*  
  s1 d; ge8/``=  
  long long e; 63A}TBC  
  }; K<>sOWZ'S  
@e{^`\l=<  
  #pragma pack() ^aW Z!gi  
D+>1]ij  
  问 0 iJue &  
  1.sizeof(s2) = ? yq$,,#XDD=  
  2.s2的s1中的a后面空了几个字节接着是b? tor!Dl@Mo  
aM;W$1h  
A~mum+[5  
#Skv(IL  
  如果您知道答案请在讨论中写出,以下是部份网友的答案,供参考: H*r>Y  
4"Hye&O  
  网友rwxybh(行云)的答案: M8u<qj&<O  
  内存布局是 N?.%?0l  
  1*** 11** 9+pmS#>_  
  1111 **** IH"6? 9nd  
  1111 1111 Nv"EV;$  
.aflsUD  
  所以答案就是24和3 yxc=Z0~1  
=Qn ;_+Ct  
  下面是一个测试的程序,试一试就知道了,我用的是VC2005 $.bBFWk  
Qa.u Mq  
  #pragma pack(8) &y#r;L<9  
VJS8)oI~  
  struct s1{ YX#-nyK  
  short a; // 2 BYtes I"`M@ %  
  long b; // 4 Bytes e>AE8T  
  }; {` w;39$+  
  struct s2{ R=KQ  
  char c; // 1 Byte vI@%Fg+D  
  s1 d; // 8 Bytes |n] d34E  
  long long e; // 8 Bytes FJd]D[h  
  }; S<J}[I7V  
  // 1*** 11** y\x+  
  // 1111 **** Mec5h}^  
  // 1111 1111 [n/hkXa$\  
  // .(WQYOMl0  
iya"ky~H  
  // 00 01 02 03 04 05 06 07 *<!oHEwkN  
  // 00 01 02 03 04 05 06 07 Y &K;l_  
  // 00 01 02 03 04 05 06 07 B2O}1.  
  // plZ>03(6Q  
  #pragma pack() CJ++?hB]X  
28=O03q  
  int main(int argc, char* argv[]) =J~ x  
  { 6VhjJJ  
  s2 a; [0D Et   
  char *p = (char *)&a; )[Yv?>ib  
  for(int i=0;i<24;++i) b4pm_Um  
  p = (char)(i%8); =ha{Ziryo  
  printf("%d\n",sizeof(a)); & :7ZQ1  
  printf("c=0x%lx\n",a.c); k%G1i-] 4  
  printf("d.a=0x%x\n",a.d.a); Ft!],n-n*  
  printf("d.b=0x%x\n",a.d.b); Tq~=TSD  
  printf("e=0x%llx\n",a.e); vz!s~cAt  
  return 0; 71{p+3Z&  
  } k|!EDze43?  
  结果: NrJKbk^4u/  
  24 R`~z0 d.  
  c=0x0 T|TO}_x  
  d.a=0x504 +="e]Yh;  
  d.b=0x3020100 |u;v27  
  e=0x706050403020100 a.zpp'cEb  
\~_9G{2?  
,#kIr  
  网友 redleaves (ID最吊的网友)的答案和分析: pt}X>ph{  
wLH] <k  
  如果代码: nxl[d\ap+n  
  #pragma pack(8) 10U9ZC  
  struct S1{ Qg<(u?7N  
  char a; .?hP7;hhI  
  long b; d09k5$=gJ  
  }; cx0*X*  
  struct S2 { GbaEgA'fa  
  char c; Y"wUt &  
  struct S1 d; x UD-iSY  
  long long e; qZA).12qS  
  }; `FC(  
  #pragma pack() ,11H.E Z  
  sizeof(S2)结果为24. *C:|X b<9  
  成员对齐有一个重要的条件,即每个成员分别对齐.即每个成员按自己的方式对齐. @Rw!'T  
  也就是说上面虽然指定了按8字节对齐,但并不是所有的成员都是以8字节对齐.其对齐的规则是,每个成员按其类型的对齐参数(通常是这个类型的大小)和指定对齐参数(这里是8字节)中较小的一个对齐.并且结构的长度必须为所用过的所有对齐参数的整数倍,不够就补空字节. c7FRI0X  
0a"c2J  
  S1中,成员a是1字节默认按1字节对齐,指定对齐参数为8,这两个值中取1,a按1字节对齐;成员b是4个字节,默认是按4字节对齐,这时就按4字节对齐,所以sizeof(S1)应该为8; TU 1I} ,  
  S2中,c和S1中的a一样,按1字节对齐,而d 是个结构,它是8个字节,它按什么对齐呢?对于结构来说,它的默认对齐方式就是它的所有成员使用的对齐参数中最大的一个,S1的就是4.所以,成员d就是按4字节对齐.成员e是8个字节,它是默认按8字节对齐,和指定的一样,所以它对到8字节的边界上,这时,已经使用了12个字节了,所以又添加了4个字节的空,从第16个字节开始放置成员e.这时,长度为24,已经可以被8(成员e按8字节对齐)整除.这样,一共使用了24个字节. lgtC|k M=  
  a b ~((w?Yy"v  
  S1的内存布局:11**,1111, uF3qD|I\  
  c S1.a S1.b d @$+ecaVW  
  S2的内存布局:1***,11**,1111,****11111111 ,9o"43D:a|  
dB5b@9*  
  这里有三点很重要: ok4@N @  
  1.每个成员分别按自己的方式对齐,并能最小化长度 fw RZ5`v<  
  2.复杂类型(如结构)的默认对齐方式是它最长的成员的对齐方式,这样在成员是复杂类型时,可以最小化长度 RSfzRnhmr  
  3.对齐后的长度必须是成员中最大的对齐参数的整数倍,这样在处理数组时可以保证每一项都边界对齐 9,r rQQD_  
qm8&*UuKJ  
}x wu*Zx  
  网友xue23(xue23) 的答案和分析: JC3m.)/  
>L 0_dvr  
  有程序查一下各个变量的内存地址得知:  1OF& *  
  各个变量在内存中的位置为 _}En/V_  
  c***aa** A`}rqhU.{-  
  bbbb**** 4BKI-;v$  
  dddddddd \<)9?M :  
  测试代码为: i|m3mcI%2  
  s2 ss; 6ZQwBS0Y  
  cout << "ss.c = " << &ss << endl ; Q(oN/y3,  
  cout << "ss.d.a = " <<&ss.d.a << endl; ;{" +g)u  
  cout << "ss.d.b = " <<&(ss.d.b) <  cout << "ss.d = " <<&ss.e << endl; 81i655!Z  
  print out 各个变量的内存地址不就可以看出来了吗。 Sh8"F@P8  
d|yAs5@  
  所以答案是24,2. }-6)gWe  
}-sdov<<  
  但是我的想像中应该是这样的分布情况: +qwjbA+  
  c******* jWE :ek*  
  aa**bbbb 5qP:/*+  
  dddddddd qDfd.gL  
[F6U+1n8e  
  不知为什么会c和a放在一起,组成8位长度。
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
级别: 经院小学
发帖
138
铜板
17050
人品值
97
贡献值
0
交易币
0
好评度
138
信誉值
0
金币
0
所在楼道

只看该作者 1 发表于: 2006-04-08
微软不会考这题目的^_^,微软看中的是idea.你可以去面一回,微软的题目很人性化,而这种分配内存的题目很少会考.^_^
描述
快速回复

您目前还是游客,请 登录注册
如果您在写长篇帖子又不马上发表,建议存为草稿
认证码:
验证问题:
10+5=?,请输入中文答案:十五