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

Ste*_*mer 1 c malloc free calloc dynamic-memory-allocation

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

#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;
}
Run Code Online (Sandbox Code Playgroud)

当第二个,printf()运行时,它显示p [2] = 30,而p [0] = p [1] = 0(在gcc ubuntu和Code :: Blocks窗口中的一些任意值).我有两个问题.

  1. 为什么free()释放前两个指针而不是第三个指针.一?
  2. 当显示任意值似乎正确时,为什么ubuntu中的值显示为0?

我是初学者所以请耐心等待.我用malloc()尝试了同样的事情,同样的事情发生了.

Sou*_*osh 6

使用已经是free()-d的内存调用未定义的行为.不要那样做.

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

使用指向通过调用freeor realloc函数解除分配的空间的指针的值.

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

作为上述问题的预防措施,NULL在调用之后将指针设置为显式被认为是一种很好的编码实践free().但是,FWIW,这不是强制性的.

引用C11,第7.22.3.3章

free函数使得指向的空间ptr被释放,即可用于进一步分配.[...]

另外,我想补充,部分free()是不可能的调用free(),反正.您可以参考此前一个答案以获得澄清.

  • 因此,在释放它们之后,应始终将释放的指针设置为null. (4认同)
  • @Tyler不是授权,而是一个很好的做法,我同意.:) (2认同)