C语言笔试题

vv1133 2009-12-27 07:27:18
void Test(void)
{
char *str = (char *) malloc(100);
strcpy(str, “hello”);
free(str);
if(str != NULL)
{
strcpy(str, “world”);printf(str);
}
}

请问运行Test 函数会有什么样的结果?
答:输出“world”



请问这题str已经free掉了,为什么还能用strcpy赋值?
...全文
176 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangzhiwenwzw 2009-12-29
  • 打赏
  • 举报
回复
这属于野指针问题:野指针是指那些你已经释放掉的内存指针。
当你调用free(p)时,你真正清楚这个动作背后的内容吗?你会说p指向的内存被释放了。没错,p本身有变化吗?答案是p本身没有变化。它指向的内存仍然是有效的,你继续读写p指向的内存,没有人能拦得住你。

释放掉的内存会被内存管理器重新分配,此时,野指针指向的内存已经被赋予新的意义。对野指针指向内存的访问,无论是有意还是无意的,都为此会付出巨大代价,因为它造成的后果,如同越界访问一样是不可预料的。
(内存越界访问:
内存越界访问有两种:一种是读越界,即读了不属于自己的数据,如果所读的内存地址是无效的,程度立刻就崩溃了。如果所读内存地址是有效的,在读的时候不会出问题,但由于读到的数据是随机的,它会产生不可预料的后果。另外一种是写越界,又叫缓冲区溢出。所写入的数据对别人来说是随机的,它也会产生不可预料的后果。)


释放内存后立即把对应指针置为空值,这是避免野指针常用的方法。这个方法简单有效,只是要注意,当然指针是从函数外层传入的时,在函数内把指针置为空值,对外层的指针没有影响。比如,你在析构函数里把this指针置为空值,没有任何效果,这时应该在函数外层把指针置为空值。
NaS7Li 2009-12-27
  • 打赏
  • 举报
回复
他们说的都对!
hbvanguard 2009-12-27
  • 打赏
  • 举报
回复
根本就是错误的程序还能得出运行结果,更要命的是还要问个为什么
东大坡居士 2009-12-27
  • 打赏
  • 举报
回复
这么用很危险,不过出错还是机率性的~
liate1 2009-12-27
  • 打赏
  • 举报
回复
路过学习了。
shiweifu 2009-12-27
  • 打赏
  • 举报
回复
我直接告诉面试官,这么写是错的,他会怎么说?
febbird1984 2009-12-27
  • 打赏
  • 举报
回复
free的時候把str和那块内存的"绑定"关系解除了,那块内存"自由"了,但是str的值并没有改变,还是可以通过str来访问那块内存,虽然这么做比较危险,因为那块内存有可能存入了其他东西
vv1133 2009-12-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zhaixingchen 的回复:]
free掉只是释放了这块内存,并没有让它指向NULL,所以if判断为真,执行strcpy()
[/Quote]

我知道他没指向NULL,我的意思是执行strcpy它为什么不会出现段错误?
zhaixingchen 2009-12-27
  • 打赏
  • 举报
回复
free掉只是释放了这块内存,并没有让它指向NULL,所以if判断为真,执行strcpy()
vv1133 2009-12-27
  • 打赏
  • 举报
回复
但是free之后,再操作这块内存,不会越界吗?
z569362161 2009-12-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 thefirstz 的回复:]
free只是告诉操作系统这块内存可以用作它用,但你照样可以朝里面写东西(虽然这样很危险)~~
[/Quote]

学C专家又来回答了
昵称很不好取 2009-12-27
  • 打赏
  • 举报
回复
free只是告诉操作系统这块内存可以用作它用,但你照样可以朝里面写东西(虽然这样很危险)~~
stardust20 2009-12-27
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20090810/16/2592c0d8-9c14-4456-8530-b569e4430e26.html
honghu069 2009-12-27
  • 打赏
  • 举报
回复
free 只是告诉系统这块内存不用了
系统回收这块内存

69,368

社区成员

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

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