|
|
|
|
移动端

1.11.2 struct求 sizeof

《程序员面试笔试真题与解析》本书针对当前各大 IT企业面试笔试中特性与侧重点,精心挑选了 3年以来近百家典型 IT企业的面试笔试真题,这些企业涉及业务包括系统软件、搜索引擎、电子商务、手机 APP、安全关键软件等,面试笔试真题非常具有代表性与参考性。本节为大家介绍struct求 sizeof。

作者:猿媛之家来源:机械工业出版社|2017-12-06 17:20

有奖调研 | 1TB硬盘等你拿 AI+区块链的发展趋势及应用调研


1.11.2 struct求 sizeof

【真题 164】 32位机器上定义如下结构体:

  1. struct xx  
  2. {  
  3. long long _x1;  
  4. char _x2;  
  5. int _x3;  
  6. char _x4[2];  
  7. static int _x5;  
  8. };  
  9. int xx::_x5; 

此时,sizeof(xx)的大小是()。

A.19 B.20 C.15 D.24答案:D。求解各种类型数据变量的 sizeof值是一个常考的题型。对于基本数据类型而言,这种问题较为简单。

以下是一些常见的结构类型的 sizeof大小(备注:在 32位计算机下)。

  1. int x;  
  2. cout << sizeof(long long) << endl;//8  
  3. cout << sizeof(char) << endl;//1  
  4. cout << sizeof(int) << endl;//4  
  5. cout << sizeof(long) << endl;//4  
  6. cout << sizeof(float) << endl;//4  
  7. cout << sizeof(x) << endl;//4 

以上类型都属于基本数据类型,但如果遇到复杂结构了,例如结构体、结构体嵌套结构体、派生类、带虚函数、空类等,它们的 sizeof该如何求解呢?本题中,由于成员变量 _x5是静态变量,所以,可以不用管它,其次是要考虑字节对齐的问题。对于结构体中没有含有结构体变量的情况,有两条原则:

1)结构体变量中成员的偏移量必须是成员大小的整数倍。

2)结构体的昀终大小必须是结构体昀大的基本类型的整数倍。

x1的偏移量是 0,长度是 8,符合; x2的偏移量是 8,长度是 1,符合; x3的偏移量是 9,长度是 4,不符合,需要在 x2之后填充 3字节使得 x3的偏移量达到 12;x4的偏移量是 16,长度是 2,符合;此时总长度为(8)+(1+3)+(4)+(2)=18,而昀大简单类型为 long long长度为 8,需要在 x4之后再填充 6字节,使得总长度达到 24可被 8整除。因此 sizeof(xx)的结果为 24。在 Visual Studio 2010环境下运行结果也为 24,正好印证了这一结论。所以,选项 D正确。

【真题 165】有如下代码:

  1. typedef union  
  2. {  
  3. long i; int k[5];  
  4. char c;  
  5. } DATE;  
  6. struct data  
  7. {  
  8. int cat;  
  9. DATE cow;  
  10. double dog;  
  11. } too;  
  12. DATE max; 

则语句 printf("%d", sizeof(too)+sizeof(max));的执行结果是什么?

答案:52。

本题中,DATE是一个 union(联合)类型, union的 sizeof通常取其成员变量的昀大值,同时,地址的对齐方式还得考虑 union中其他的数据成员。对于本题而言,其成员变量里面昀大的变量类型是 int[5],在 32位机器下,每个 int型变量占用 4个字节空间, int[5]占用 4*5个字节,即 20个字节,所以, sizeof(max)的值为 20。由于 union中有 long类型的成员存在,而 long占用 8个字节,因此, union的对其方式为 8,为了满足对齐的要求,需要填充 4个字节, sizeof(max)=24。data是一个 struct(结构体)类型,在 32位机器下,每个变量分开占用空间,依次为 int(4) + DATE(24)+填充 4个字节 + double(8) = 40,所以,sizeof(too)+sizeof(max)=24+40=64。

本题中需要注意的一个问题就是字节对齐。本书中已在其他章节对字节对齐进行了详细介绍,此处不再赘述。

喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

超级网管员——网络基础

本书全面系统地概括了计算机网络的基本理论,详细阐述了OSI模型与网络协议、网络规划与综合布线、对等网络与服务器/客户端网络、Intranet服...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊