我不知道我做错了什么或者我的概念是否有些错误
#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窗口中的一些任意值)。我有两个问题。
我是初学者所以请耐心等待。我用malloc()尝试了同样的事情,同样的事情发生了。
答案 0 :(得分:6)
使用已经free()
的内存 - d调用undefined behavior。 不要这样做。
引用C11
,附件§J.2,未定义的行为
指向由
free
或realloc
调用释放的空间的指针的值 使用free()
函数。
详细说明,在指针上调用NULL
不会将指针设置为NULL
或其他任何内容。它只是将内存标记为内存管理器可重用。该程序的内存位置(指针)不再有效,因此您不应该使用它。
作为针对上述问题的预防措施,在调用free()
后明确将指针设置为C11
被认为是一种良好的编码习惯。但是,FWIW,这不是强制。
引用free
,第7.22.3.3章
ptr
函数导致free()
指向的空间被释放,即 可供进一步分配。 [...]
此外,只是要添加,无论如何都无法通过调用free()
来实现部分{{1}} 。你可以refer to this previous answer for clarification。