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

1.14.3 内存泄漏

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

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

1.14.3 内存泄漏

【真题 205】有如下代码:

  1. void TestMemory(char *p)  
  2. {  
  3. p = (char *)malloc(100);  
  4. }  
  5. main()  
  6. {  
  7. char *str = NULL;  
  8. TestMemory(str);  
  9. strcpy(str, "hello world");  
  10. printf(str);  

打印结果为 hello world。

答案:错误。

上面程序在运行之后:

1)调用

TestMemory(str)后,str并未产生变化,依然是 NULL(由于 str是按值传递的)。只有形参 p指向了一块新申请的空间。

2)程序运行到 strcpy( str, "hello world" );处将产生错误。

3)申请空间的时候有可能内存出错,应该在语句 *p = (char *) malloc( num );之后判断内存是否申请成功,应该添加如下代码:

  1. if (*p == NULL)  
  2. {  
  3. ...//进行申请内存失败处理  

4)动态创建的内存没释放。

可以参考以下修改方法:

  1. char *GetMemory()  
  2. {  
  3. char *p = (char *)malloc(100);  
  4. return p;  
  5. }  
  6. main()  
  7. {  
  8. char *str = NULL;  
  9. str = GetMemory();  
  10. strcpy(str, "hello world");  
  11. printf(str);  
  12. freee(str);  

【真题 206】有如下代码:

  1. void TestMemory(char *p)  
  2. {  
  3. char p[] = "hello world";  
  4. return p;  
  5. }  
  6. main()  
  7. {  
  8. char *str = NULL;  
  9. str = TestMemory();  
  10. printf(str);  

此代码打印不出任何结果。

答案:错误。打印乱码。

  1. char p[] = "hello world";  
  2. return p; 

数组 p[]为函数内的局部自动变量,存放在函数对应的栈中,在函数返回后,函数栈内存被回收,内存已经被释放,因此它的内容是不确定的。这是许多程序员常犯的错误,其根源在于不理解变量的生存周期。

【真题 207】堆栈溢出的原因是什么?答案:堆栈溢出的原因是没有进行垃圾回收,即动态申请的内存忘记释放了,表现形式就是 new与 delete,malloc与 free没有成对出现。

【真题 208】开发 C代码时,经常见到如下类型的结构体定义:

  1. typedef struct list_t{  
  2. struct list_t *next;  
  3. struct list_t *prev;  
  4. char data[0];  
  5. }list_t; 

最后一行语句 char data[0];的作用是()。

A.方便管理内存缓冲区 B.减少内存碎片化 C.标识结构体结束 D.没有作用答案:A、B。柔性数组是 C99的扩展,简而言之,就是一个在 struct结构里的标识占位符(不占结构 struct的空

间)。主要有以下两点用途:

1)满足需要变长度的结构体。

2)使这个结构体是可变长的。对于编译器来说,此时长度为 0的数组并不占用空间,因为数组名本身不占空间,它只是一个偏移量,数组名这个符号本身代表了一个不可修改的地址常量(注意:数组名永远都不会是指针!),但对于这个数组的大小,就可以进行动态分配。

所以,选项 A与选项 B正确。

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

51CTO读书频道二维码


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

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

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

读 书 +更多

鸟哥的Linux私房菜 基础学习篇(第二版)

本书全面而详细地介绍了Linux操作系统。全书分为5个部分:第一部分着重说明Linux的起源及功能,如何规划和安装Linux主机;第二部分介绍Linu...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊