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窗口中的一些任意值).我有两个问题.
我是初学者所以请耐心等待.我用malloc()尝试了同样的事情,同样的事情发生了.
使用已经是free()-d的内存调用未定义的行为.不要那样做.
引用C11,附件§J.2,未定义的行为
使用指向通过调用
freeorrealloc函数解除分配的空间的指针的值.
详细说明,调用free()指针不会将指针设置为NULL其他任何内容.它只是将内存标记为内存管理器可重用.该程序的内存位置(指针)不再有效,因此您不应该使用它.
作为上述问题的预防措施,NULL在调用之后将指针设置为显式被认为是一种很好的编码实践free().但是,FWIW,这不是强制性的.
引用C11,第7.22.3.3章
该
free函数使得指向的空间ptr被释放,即可用于进一步分配.[...]
另外,我想补充,部分free()是不可能的调用free(),反正.您可以参考此前一个答案以获得澄清.