例子42-1:函数
#include "stdio.h" #include "malloc.h" void test(int* p,int size) { int i = 0; for(i = 0; i < size; i++) { printf("%d\n",p[i]); } // free(p); } void func(unsigned int size) { int *p = (int*)malloc(size *sizeof(int)); int i = 0; if(size % 2 != 0) { return; } for(i = 0; i < size; i++) { p[i] = i; printf("%d\n",p[i]); } free(p); } int main() { int* p = (int*)malloc(5 * sizeof(int)); //在main函数里面申请的动态内存,就要在main函数里面释放 test(p , 5); free(p); func(9); func(9); return 0; }
输出结果:指针
func函数会产生内存泄漏,若是是基数就会直接return,致使内存没有释放,形成内存泄漏
例子42-2:code
#include "stdio.h" #include "malloc.h" struct Demo { char *p; } int main() { struct Demo d1; struct Demo d2; char i = 0; for(i = 'a';i < 'z';i ++) { d2.p[i] = 0; } d2.p = (char*)calloc(5,sizeof(char)); printf("%s\n",d2.p); for(i = 'a';i < 'z';i ++) //内存越界 { d2.p[i] = i; } free(d2.p); return 0; }
动态内存申请以后,应该当即检查指针值是否为NULL,防止使用NULL指针。内存
int* p = (int*)malloc(56); if(p != NULL) { } free(p);
free指针以后必须当即赋值为NULLio
int* p = (int*)malloc(20); free(p); p = NULL; //...... //...... if(p != NULL) { }
任何与内存操做相关的函数必须带长度信息test
void print(int* p,int size) { int i = 0; char buf[128] = {0}; snprintf(buf,sizeof(buf),"%s","D.T.Software"); for(i = 0;i < size; i++) { printf("%d\n",p[i]); } }
malloc操做和free操做必须匹配,防止内存泄漏和屡次释放。不要跨函数释放内存。变量
void func() { int* p = (int*)malloc(20); free(p); } int main() { int* p = (int*)malloc(20); func(); free(p); return 0; }