一点一滴在学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