关于野指针问题。内存被释放,为什么不能使用这块内存。

char*p=(char*)malloc(100);strcpy(p,“hello”);free(p);if(p!=NULL)strcpy(p,“world”);//出错... char *p = (char *) malloc(100);

strcpy(p, “hello”);
free(p);
if(p != NULL)
strcpy(p, “world”); // 出错
这个地方为什么出错,p被释放也就是p指向的内存中的数据被释放,但p还是指向这个地址啊,为什么这块内存不能重新赋值?
展开
 我来答
kaixingui2012
2011-09-01 · TA获得超过4.2万个赞
知道大有可为答主
回答量:1.4万
采纳率:81%
帮助的人:6763万
展开全部
free函数实现通知系统回收相关资源,即让当前分配的内存可以重新被其他应用所使用。
如果你还想使用这块内存就不要去释放它!(好比是,你借了别人的车,用完后,还给了人家,还给人家后,你还要开人家的车,能行吗?)
引用别人的描述:
3、free()到底释放了什么

这个问题比较简单,其实我是想和第二大部分的题目相呼应而已!哈哈!free()释放的是指针指向的内存!注意!释放的是内存,不是指针!这点非常非常重要!指针是一个变量,只有程序结束时才被销毁。释放了内存空间后,原来指向这块空间的指针还是存在!只不过现在指针指向的内容的垃圾,是未定义的,所以说是垃圾。因此,前面我已经说过了,释放内存后把指针指向NULL,防止指针在后面不小心又被解引用了。非常重要啊这一点!
参考:
http://forum.byr.edu.cn/pc/pccon.php?id=315&nid=68136
追问
p变成野指针后还是指向这块地址的吧,还是指向不确定的地址?
追答
那就要看一下free函数的实现方式了,如果free函数不改变p的值,它当然还是存储的原地址。

注意:
指针,全名叫指针变量,他是用来存地址的。我们只是通过它来访问内存中的数据。一般来说,它存的是什么地址,我们就说它指向哪个地址。
它和int a=5;的功能一样,只不过a中存的是5,而p中存的是地址。
一路的累CZ41c
2011-09-01 · TA获得超过126个赞
知道小有建树答主
回答量:218
采纳率:0%
帮助的人:152万
展开全部
内存已经释放了,只是p这个变量仍然存在而已,所以你没分配内存,你咋能赋值啊!抢内存啊!
所以最好p=NULL; 防止误用

#include "stdio.h"

int main()
{
char *p = (char *) malloc(100);
strcpy(p, "hello");
printf("%s\n", p);
printf("%p\n", p);
printf("%p\n", *p);
free(p);
printf("%s\n", p);
printf("%p\n", p);
printf("%p\n", *p);
getchar();
}

打印看看
追问
可我在VS2005上可以通过,能正常输出world。所以我认为P还是有指向某一块内存的。
追答
char *p = (char *) malloc(100);
strcpy(p, "hello");
printf("%s\n", p);
printf("%p\n", p);
printf("%p\n", &p);
free(p);
printf("%s\n", p);
printf("%p\n", p);
printf("%p\n", &p);
getchar();
之前好像写错了 看看 还是指向原来的地址
我在dev c++实验的结果和你一样,估计是编译器的问题吧,书上应该说不能这样的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友7fc152d58
2011-09-02 · 超过12用户采纳过TA的回答
知道答主
回答量:48
采纳率:0%
帮助的人:39.9万
展开全部
内存被释放了数据还能输出是正常的,但是不能进行写操作,在你进行其它操作之后(如分配另一块内存给另一个变量,然后操作等等)再打印p,就不一定还能输出了,这个原理就像你把一个文件彻底删除了,有时还能用工具恢复,有时不能一样
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式