|
|
51CTO旗下网站
|
|
移动端

1.5 结构体

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

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

1.5 结构体

【真题 44】在一个 64位的操作系统中,定义如下结构体:

  1. struct st_task  
  2. {  
  3. uint16_t id;  
  4. uint32_t value;  
  5. uint64_t timestamp;  

同时定义 fool函数如下:

  1. void fool()  
  2. {  
  3. st_task task = {};  
  4. uint64_t a = 0x00010001;  
  5. memcpy(&task, &a, sizeof(uint64_t));  
  6. printf("% 11u, % 11u, % 11u", task.id, task.value, task.timestamp);  

上述 fool()函数的执行结果为()。

A.1,0,0B.1,1,0C.0,1,1 D.0,0,1

答案:A。

内存对齐的细节和编译器实现相关,但一般而言,满足以下三个准则:

1)结构体变量的首地址能够被其昀宽基本类型成员的大小所整除。

2)结构体中每个成员相对于结构体首地址的偏移量( offset)都是成员大小的整数倍,如果有需要,编译器会在成员之间加上填充字节。

3)结构体的总大小为结构体中昀宽基本类型成员大小的整数倍,如果有需要,编译器会在昀末一个成员之后加上填充字节。对于本题而言,这个结构体在内存中所占的空间如下图所示:

其中,id占用两个字节,为了字节对齐,接下来的两个字节为填充的空白, value占用四个字节, timestamp占用八个字节,调用 memcpy函数后,id被初始化为 0001,两字节的填充地址也被初始化为 0001。而 value与 timestamp所占的内存被初始化为 0。因此,只有 id的值为 1,value与 timestamp的值都为 0。

为了验证以上分析,在 Visual Studio 2010下运行上述代码,其结果为 1,0,0,与选项 A符合。所以,选项 A正确。

【真题 45】下述代码定义了一个结构体:

  1. struct Date  
  2. {  
  3. char a;  
  4. int b;  
  5. int64_t c;  
  6. char d;  
  7. };  
  8. Date data[2][10]; 

如果 Date的地址是 x,那么 data[1][5].c的地址是()。

A.x+195 B.x+365 C.x+368 D.x+215

答案:C。

本题中,结构体成员地址对齐

a b cd

1+(3)+4+8+1+(7)= 24,()内的数表示为了满足对齐填充的大小。

&data[1][5].c = x+10*24+5*24+1+(3)+4=368。所以,选项 C正确。

【真题 46】 C语言和 C++语言中的 struct有什么不同?

答案:C语言与 C++语言中都存在 struct,C语言和 C++语言中 struct的主要区别是 C语言中的 struct不可以含有成员函数,而 C++语言中的 struct可以含有成员函数。 C++语言中 struct和 class的主要区别在于默认的存取权限不同, struct默认为 public,而 class默认为 private。

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

51CTO读书频道二维码


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

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

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

读 书 +更多

JAVA并发编程实践

本书既能够成为读者的理论支持,又可以作为构建可靠的、可伸缩的、可维护的并发程序的技术支持。本书并不仅仅提供并发API的清单及其机制,...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊