这道华为面试题有什么问题?

lelefox 2012-03-09 01:23:31

void getmemory(char *p)
{
p=(char *)malloc(100);
strcpy(p,"hello world");
}
int main(int argc, char* argv[])
{
char *str=NULL;//"ni hao";
getmemory(str);
printf("%s\n",str);
free(str);
return 0;
}


http://wenku.baidu.com/view/dc7682c34028915f804dc248.html中第 18题,答案说程序会崩溃。getmemory中的malloc不能返回动态内存,free()对str操作很危险。
我在vc6.0上试了一下,正常输出null,没有崩溃。是不是作者把题目记错了?
...全文
533 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
DaviesX 2012-03-09
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 yht8708 的回复:]

指针传递的时候 我怎么记得是不会构造副本的? 我记错了?
引用 4 楼 daviesx 的回复:
在调用 getmemory 的时候传入的是 char *, 仅仅是 str 的一个副本, getmemory 函数里的语句不会修改str的值, 而是它的副本的值, 在函数结束时 *p 被释放, 发生了内存泄漏。
而在 printf 的时候由于 str 是空指针, 不会输出, 然后对一个空指针 ……
[/Quote]

呵呵, 指针也是一种变量, 4 bytes 的变量, 不过是存地址的
和其他变量一样, 传参的时候也要副本. 除非是引用类型, 我待会发个汇编
我是波哥 2012-03-09
  • 打赏
  • 举报
回复
str被赋值为空,调用getmemory()时 p和str一样都指向一个空,使用malloc开辟空间后p指向新的地址,但是str并没有指向该地址依然为空,所以使用printf输出时,str只想为空,是一个无效的地址。
所以用char *str="ni hao"代替char *str=NULL;后 printf将输出的是ni hao
而不是hello word。
yht8708 2012-03-09
  • 打赏
  • 举报
回复
指针传递的时候 我怎么记得是不会构造副本的? 我记错了?
[Quote=引用 4 楼 daviesx 的回复:]
在调用 getmemory 的时候传入的是 char *, 仅仅是 str 的一个副本, getmemory 函数里的语句不会修改str的值, 而是它的副本的值, 在函数结束时 *p 被释放, 发生了内存泄漏。
而在 printf 的时候由于 str 是空指针, 不会输出, 然后对一个空指针 free 就segment fault 了
[/Quote]
DaviesX 2012-03-09
  • 打赏
  • 举报
回复
我是在linux 下用 gcc 编译的
WHSWXR 2012-03-09
  • 打赏
  • 举报
回复
虽然感觉上应该崩溃,但事实上确实如楼主所说,没有崩溃。
w2214149026 2012-03-09
  • 打赏
  • 举报
回复
你在VC6下编译是DEBUG版本的吧?你试试RELEASE版本看崩溃不。哈哈。
DaviesX 2012-03-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 daviesx 的回复:]

在调用 getmemory 的时候传入的是 char *, 仅仅是 str 的一个副本, getmemory 函数里的语句不会修改str的值, 而是它的副本的值, 在函数结束时 *p 被释放, 发生了内存泄漏。
而在 printf 的时候由于 str 是空指针, 不会输出, 然后对一个空指针 free 就segment fault 了
[/Quote]

[Quote=引用 21 楼 greenspan 的回复:]

有泄露,但free(NULL),do nothing是没有问题的
[/Quote]


对, 我说错了, free ( 0 ); 是没问题的
不过单步的时候发现是 printf 越界了
  • 打赏
  • 举报
回复
指针也是有形参的,
用二级指针或引用应该都可以

此题纯基础也
greenspan 2012-03-09
  • 打赏
  • 举报
回复
有泄露,但free(NULL),do nothing是没有问题的
飞天絮雪 2012-03-09
  • 打赏
  • 举报
回复
感觉楼主面试前是没做功课,纯属裸试
飞天絮雪 2012-03-09
  • 打赏
  • 举报
回复
感觉楼主面试前是没做功课,纯数裸试
Gsnsm 2012-03-09
  • 打赏
  • 举报
回复



#include <stdio.h>
void getmemory(char *p)
{
p=(char *)malloc(100);

printf("p=%p\n",p); //形参p指向的地址

strcpy(p,"hello world");
}
int main(int argc, char* argv[])
{
char *str=NULL;//"ni hao";

printf("str=%p\n",str); //实参str指向的地址

getmemory(str);

printf("str=%p\n",str); //调用函数后str指向的地址 ,str指向的地址没有被改变,它没有指向函数内所开辟的空间

printf("%s\n",str);
free(str);

system("pause");
return 0;
}





sgmcy 2012-03-09
  • 打赏
  • 举报
回复
malloc和free一起使用,否则会增加代码的耦合度。不利于模块化集成。上面程序容易造成内存泄露
kason2011 2012-03-09
  • 打赏
  • 举报
回复
up
用双指针或者函数返回指针[Quote=引用 4 楼 daviesx 的回复:]

在调用 getmemory 的时候传入的是 char *, 仅仅是 str 的一个副本, getmemory 函数里的语句不会修改str的值, 而是它的副本的值, 在函数结束时 *p 被释放, 发生了内存泄漏。
而在 printf 的时候由于 str 是空指针, 不会输出, 然后对一个空指针 free 就segment fault 了
[/Quote]
陈思有 2012-03-09
  • 打赏
  • 举报
回复
我最近也遇到了类似的问题……
鲲尘千古 2012-03-09
  • 打赏
  • 举报
回复
我又学习了!
hu7324829 2012-03-09
  • 打赏
  • 举报
回复
这就是企图修改 临时性的形参 问题
AnYidan 2012-03-09
  • 打赏
  • 举报
回复
林锐 《高质量C/C++编程》
独行侠客2 2012-03-09
  • 打赏
  • 举报
回复
?????????
随风Marz 2012-03-09
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 kason2011 的回复:]
up
用双指针或者函数返回指针

引用 4 楼 daviesx 的回复:

在调用 getmemory 的时候传入的是 char *, 仅仅是 str 的一个副本, getmemory 函数里的语句不会修改str的值, 而是它的副本的值, 在函数结束时 *p 被释放, 发生了内存泄漏。
而在 printf 的时候由于 str 是空指针, 不会输出, 然后对一个空指针 free 就seg……
[/Quote]同意,只要理解原理就行了,至于结果就要看编译器了,不用再追究了,此问题可以结束了
加载更多回复(13)

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧