我不知道我在做错了什么还是我的概念有些不对劲
#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个问题。
- 为什么free()释放前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()
的。您可以参考以前的答案以进行澄清。