This question already has answers here:
Closed 3 years ago.
free() not deallocating memory?
(5个答案)
我不知道我是做错了什么,还是我的观念有些错误
当运行第二个printf()时,它显示p[2]=30,而p[0]=p[1]=0(在gcc ubuntu和Code::Blocks windows中的一些任意值中)我有两个问题。
为什么free()释放前两个指针而不是第三个指针?
为什么ubuntu中的值显示为0,而显示任意值似乎是正确的?
我是初学者,请容忍我。我用malloc()也尝试过同样的方法,同样的事情也会发生。
(5个答案)
我不知道我是做错了什么,还是我的观念有些错误
#include<stdio.h>
#include<stdlib.h>
int main()
{
int *p;
p=calloc(3,sizeof(int));
p[0]=10;
p[1]=15;
p[2]=30;
printf("\n%d\n%p\n%d\n%p\n%d\n%p\n\n",p[0],p,p[1],p+1,p[2],p+2);
free(p);
//p=NULL;
printf("\n%d\n%p\n%d\n%p\n%d\n%p\n\n",p[0],p,p[1],p+1,p[2],p+2);
return 0;
}
当运行第二个printf()时,它显示p[2]=30,而p[0]=p[1]=0(在gcc ubuntu和Code::Blocks windows中的一些任意值中)我有两个问题。
为什么free()释放前两个指针而不是第三个指针?
为什么ubuntu中的值显示为0,而显示任意值似乎是正确的?
我是初学者,请容忍我。我用malloc()也尝试过同样的方法,同样的事情也会发生。
最佳答案
使用已经free()
-d的内存调用undefined behavior别那么做。
引用C11
,附录J.2,未定义行为
指通过调用free
或realloc
函数被使用。
要详细说明,对指针调用free()
不会将指针设置为NULL
或任何其他值它只是将内存标记为可由内存管理器重用。该内存位置(指针)对程序不再有效,因此您不应该使用它。
作为上述问题的预防措施,在调用NULL
之后显式地将指针设置为free()
被认为是一种良好的编码实践然而,FWIW,这不是强制性的。
引用C11
,第7.22.3.3章free
函数使ptr
指向的空间被释放,即
可供进一步分配[...]
另外,要添加的是,无论如何,通过调用free()
,部分free()
是不可能的。你可以refer to this previous answer for clarification。
关于c - 为什么free()不取消分配所有已分配的内存位置? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37888649/
10-14 12:32