一点一滴在学C——内存管理
最近一直在看C 今天看到内存管理,知道是C比较重要的一个环节,前阵子刚刚掰清楚了指针和变量。今天主要看的是malloc和calloc两个结合free
这个文章就当读书笔记了,希望能够坚持写下去
根据书中说的malloc分配的内存可以通过free来释放,我当初傻傻的认为会不会释放就是把数据擦掉了?其实现实中真不是这么操作的。
int * p=(int*)malloc(5*sizeof(int) );
int i=0;
if (p==NULL)
{
printf("malloc failed!\n");
}
else
{
printf("malloc successful!\n");
for (i=0;i<5;i++)
{
*(p+i)=i;
printf("0x00%x\n",p+i);
printf("%d\n", *(p+i));
}
// free(p);
for (i=0;i<5;i++)
{
*(p+i)=i;
printf("0x00%x\n",p+i);
printf("%d\n", *(p+i));
}
int* f=(int *) calloc(5,4);
printf("%x\n",f);
if (f==NULL)
{
printf("failed");
}
else
{
printf("successful!");
}
free(f);
}
上面这段代码其实就是说我要声明一个动态分配的空间,如果空间分配成功有返回。之后我输出了所有结果。输出之后我释放了P变量,本以为他会擦掉,结果没有,我又紧接着声明了一个区域F,F的分配地址也是28e20。逐渐有点明白了,再进行一个测试注释掉free(p);这行,发现f的分配地址和P之前分配的是一样的28e00。这样就说明其实free只是一个重置指针的计数器而已。如果free了以后该内存地址存储内容不变,不过之后再分配会有被改写的可能。
malloc successful! 0x0028e00 0 0x0028e04 1 0x0028e08 2 0x0028e0c 3 0x0028e10 4 0x0028e00 0 0x0028e04 1 0x0028e08 2 0x0028e0c 3 0x0028e10 4 28e20