免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 6841 | 回复: 22
打印 上一主题 下一主题

[C] C/C++ 简单的一个malloc面试题 [复制链接]

论坛徽章:
1
射手座
日期:2014-08-04 16:49:43
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-10-13 11:20 |只看该作者 |倒序浏览
本帖最后由 hanzhenlll 于 2012-11-01 13:10 编辑

我面试中遇到如下一个面试题.....

下面是一段有问题的代码 , 请诸位看看这段代码到底**问题?   
为了好判断,我增加一些打印,输出结果如下...



------------------------
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. void getmem (char *point)
  5. {
  6.         printf ("Getmem point 0x%x, 0x%x\n", point, &point);
  7.         if ((point = (char *)malloc (100)) == NULL)
  8.         {       
  9.                 printf ("malloc error !\n");
  10.                 // free NULL return
  11.         }
  12.         printf ("Getmem point 0x%x, 0x%x\n", point, &point);


  13. }
  14. int main (int argc, char *argv[])
  15. {

  16.         char *p1 = NULL, *p2 = NULL;

  17.         printf ("Init: p1 = 0x%x, 0x%x, p2 = 0x%x, 0x%x\n", p1, &p1, p2, &p2);
  18.         p1 = (char *)malloc (100);
  19.         printf ("Malloc: p1 = 0x%x, 0x%x\n", p1, &p1);
  20.         strcpy (p1, "world");
  21.         printf ("strcpy world --->%s \n", p1);
  22.        
  23.         getmem (p2);
  24.         printf ("After p2 = 0x%x, 0x%x\n", p2, &p2);

  25.         strcpy (p2, "hello");

  26.         printf ("%s \n", p2);
  27.         // free NULL
  28.         return 0;
  29. }
复制代码
Init: p1 = 0x0, 0xbfdfd478, p2 = 0x0, 0xbfdfd47c
Malloc: p1 = 0x9648008, 0xbfdfd478
strcpy world --->world
Getmem point 0x0, 0xbfdfd450
Getmem point 0x9648070, 0xbfdfd450
After p2 = 0x0, 0xbfdfd47c
Segmentation fault (core dumped)

通过分析发现是 申请了新的栈地址后malloc, 入参本身并没有发生变化, 就如楼下所说的缘木求鱼,很形象;        

getmem (p2); --> void getmem (char *point),这时候point 已经分配了新的栈地址,而后malloc后,point指向了新的堆区域, 但是p2本身并没有改,还是指向NULL..


解决的办法  1. getmem (&p2); void getmem (char **point);  
                2. char *getmem (char *point);  返回值申请后的堆地址..
  

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
2 [报告]
发表于 2012-10-13 11:37 |只看该作者
getmem能影响得了指针p吗? 变量赋值是拷贝, 不是引用, 指针赋值给指针是拷贝地址, 不是引用指针.

影响不了.

论坛徽章:
1
射手座
日期:2014-08-04 16:49:43
3 [报告]
发表于 2012-10-13 11:38 |只看该作者
回复 2# linux_c_py_php


    你把printf打开看一看... 你认为结果是怎么样的?

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
4 [报告]
发表于 2012-10-13 11:48 |只看该作者
代码本身除了没有free以外应该没有错误, 因为p = getmem(p);接受了函数返回值, 但代码表现出程序员没学会指针.

论坛徽章:
1
射手座
日期:2014-08-04 16:49:43
5 [报告]
发表于 2012-10-13 11:54 |只看该作者
回复 4# linux_c_py_php


    我表示很遗憾.....确实菜了很多....很多...  自己写的也没仔细看...

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
6 [报告]
发表于 2012-10-13 11:59 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
1
射手座
日期:2014-08-04 16:49:43
7 [报告]
发表于 2012-10-13 12:11 |只看该作者
pmerofc 发表于 2012-10-13 11:59
回复 1# hanzhenlll

感谢大师前来...有毛病欢迎多多指正 帮助老汉学习 进步...

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
8 [报告]
发表于 2012-10-13 12:17 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
1
射手座
日期:2014-08-04 16:49:43
9 [报告]
发表于 2012-10-13 12:22 |只看该作者
pmerofc 发表于 2012-10-13 12:17
回复 7# hanzhenlll


好的, 谢谢!~~

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
10 [报告]
发表于 2012-10-13 12:23 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP