关于网友提出的“ 为什么free掉malloc开辟的空间后还可以输出那块空间的内容??”问题疑问,本网通过在网上对“ 为什么free掉malloc开辟的空间后还可以输出那块空间的内容??”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: 为什么free掉malloc开辟的空间后还可以输出那块空间的内容??
描述: #include
#include
#include
int main(void)
{
char *p=(char *)malloc(sizeof(char)*10);
strcpy(p,"hello");
printf("%s\n",p);
free(p);
printf("s\n",p);
return 0;
}
w为什么输出结果是:hello
hello
难道没free掉p所指的那块内容?(我的编译环境是linux)
另外问一个小问题,就是在开辟动态空间是malloc()的括号里不管填多少都一样啊,都不会报错。填0也试过,都可以出来很长的数据,这是为什么呢?新手,高手勿喷。
解决方案1: free(p)只是告诉操作系统p所指向的内存可以回收利用了,但p这个栈变量的值和那个内存的值不会改变,只有当有程序再次利用那个内存时,那个内存的值才有可能改变
free(p)之后的p是野指针,大忌
建议定义
#define SafeDelete(_X_) {if(0 != _X_) {free(_X_); _X_= 0;}}
#define SafeDeleteEx(_X_) {if(0 != _X_) {delete(_X_); _X_= 0;}}
以方便使用
文件删除类似,清理过硬盘后就找不回该文件了
解决方案2: 在操作系统层面,管理着空闲内存,一般是采用链表管理
当你使用malloc()申请内存时,系统会按照你申请的大小,分配给你一块适当的内存
一般会比你申请的数值稍大一点,此时你得到了指向这块可用内存首地址的指针
当你free()掉这块内存后,系统回收,将这块内存重新挂到空闲内存的链表中
但是内存中的数据操作系统是不会主动进行处理的
如果没有其他程序修改这块内存的内容,一般不会变化
所以,你在free()后仍然可以打印原来的内容,但是这个内容已经是“不确定的了”
而且使用一个已经free()的指针是非常危险的,楼主可以搜索下“野指针”或者
“悬空指针”的内容看一下
另外,楼主说malloc() 0个字节的内存也不报错
不错,指针 p 一定会指向一个地址,你就算不申请内存
也可以向这个地址写东西,但这是严重的内存越界操作问题
运气好,运行没有问题,但是有可能不知道哪天就会出问题
或者直接,会导致程序崩溃,甚至操作系统崩溃
C语言的精髓是指针,C语言的雷区是内存
解决方案3: 这个问题以前看过问过,大神的解释是:
free()只是把那块内存重新“标记”为“可用”,那么这个程序或者其它程序就可能申请到这块内存使用;
而这块内存原来的值不一定有变化。
free()后,要把原来的指针赋值为NULL。
原帖不好找了,有兴趣可以在论坛搜索下。
解决方案4: 因为释放指针,只是将指针所指的内存空间交还给系统,而指针变量的内容(即刚释放的内存地址)并为改变,所以还能输出。但此时的指针一般称之为“野指针”,是很危险的。
所以,一般要求释放指针后,紧接着将其置为空:
free(p);
p=NULL;
解决方案5: free以后,就告诉系统free的那块内存可以被其它代码使用了,但其它代码并不一定会立即使用,也就是说,在free某块内存以后,其它代码使用这块内存以前,其内容是不变的。
解决方案6: 为什么你归还了你刚借别人的挂钟后你还可以看到那个挂钟显示几点?
(^_^)
解决方案7: 你不用malloc都可以输出任何空间的内容
解决方案8: free的标准行为只是表示这块内存可以被再分配,至于是否被抹掉,没有强制要求,有些编译器的调试模式下为了方便调试会被抹掉
以上介绍了“ 为什么free掉malloc开辟的空间后还可以输出那块空间的内容??”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/2645960.html