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



我不知道我在做错了什么还是我的概念有些不对劲

#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%dn%pn%dn%pn%dn%pnn",p[0],p,p[1],p+1,p[2],p+2);
     free(p);
     //p=NULL;
     printf("n%dn%pn%dn%pn%dn%pnn",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 blocks windows中的一些arbital值)。我有2个问题。

  1. 为什么free()释放前2个指针,而不是第三指数。一个?
  2. 为什么在显示arbital值的正确时在ubuntu中显示的值0?

我是初学者,所以请忍受我。我尝试了Malloc()尝试了同样的事情,并且发生了同样的事情。

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

引用 C11,附件§j.2,不确定的行为

指指指的是通过呼叫free或 使用realloc功能。

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

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

引用C11,第7.22.3.3章

free函数导致 ptr指向的空间被划分,也就是说 可用于进一步分配。[...]

另外,无论如何,要添加部分free() 是不可能通过调用free()的。您可以参考以前的答案以进行澄清。

相关内容

  • 没有找到相关文章

最新更新