为什么free()不释放所有分配的内存位置?

时间:2016-06-17 19:01:47

标签: c malloc free dynamic-memory-allocation calloc

我不知道我做错了什么或者我的概念是否有些错误

#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窗口中的一些任意值)。我有两个问题。

  1. 为什么free()释放前两个指针而不是第三个指针。一个?
  2. 为什么在显示任意值时,ubuntu中的值显示为0?
  3. 我是初学者所以请耐心等待。我用malloc()尝试了同样的事情,同样的事情发生了。

1 个答案:

答案 0 :(得分:6)

使用已经free()的内存 - d调用undefined behavior 不要这样做。

引用C11,附件§J.2,未定义的行为

  

指向由freerealloc调用释放的空间的指针的值   使用free()函数。

详细说明,在指针上调用NULL不会将指针设置为NULL或其他任何内容。它只是将内存标记为内存管理器可重用。该程序的内存位置(指针)不再有效,因此您不应该使用它。

作为针对上述问题的预防措施,在调用free()后明确将指针设置为C11被认为是一种良好的编码习惯。但是,FWIW,这不是强制

引用free,第7.22.3.3章

  

ptr函数导致free()指向的空间被释放,即   可供进一步分配。 [...]

此外,只是要添加,无论如何都无法通过调用free()来实现部分{{1}} 。你可以refer to this previous answer for clarification