This question already has answers here:
Closed 3 years ago.
free() not deallocating memory?
(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