-
杜绝野指针
-
指针变量中的值是非法的内存地址,进而形成野指针
-
野指针不是NULL指针,是指向不可用内存地址的指针
-
NULL指针并无危害,很好判断,也很好调试
-
C语言中更无法判断一个指针保存的地址是否合法
-
野指针的由来
-
局部指针变量 没有初始化(定义指针需要初始化NULL)
-
指针所指向的变量在指针之前被销毁
-
使用已经释放过的指针(free)
-
进行了错误的强制类型转换
-
基本原则
-
绝不 返回局部变量和局部数组的地址(因为函数在运行完后将会释放栈)
-
任何变量在定义后必须初始化为0
-
字符数组必须确认0结束符后才能成为字符串
-
任何使用与内存操作相关的函数必须指定长度信息
-
常见内存错误
-
结构体成员指针未初始化:
-
结构体成员指针未分配足够的内存
-
内存分配成功,但未初始化
-
内存操作越界
-
内存操作的交通规则
-
动态内存申请后, 应该立刻检查指针,值是否为NULL,防止使用NULL指针
-
free指针之后必须立刻赋值NULL
-
任何与内存操作相关的操作都必须 带长度信息
-
malloc操作和free操作必须 匹配,防止内存泄露和多次释放,在main函数中的malloc应该在main中free,在func函数中的malloc应该在func中free。
void print(int*p,int size) { int i = 0; char buf[128] = {0}; snprintf(buf,sizeof(buf),"%s","Hello World!"); for(i=0;i<size;i++) { printf("%d\n",p[i]); } }
小结:
-
内存错误的本质源于指针保存的地址为非法值
-
指针变量未初始化,保存随机数
-
指针运算导致内存越界
-
内存泄露源于malloc与free不匹配
-
当malloc次数多于free时产生内存泄露
-
当malloc次数少于free时,程序可能崩溃