野指针
指针变量中的值是非法的内存地址,进而形成野指针
野指针不是NULL指针,是指向不可用内存地址的指针
NULL指针并无危害,很好判断,也很好调试
C语言中无法判断一个指针所保存的地址是否合法
野指针的由来
局部指针变量没有被初始化
指针所指向的变量在指针之前被销毁
使用已经释放过的指针
进行了错误的指针运算
进行了错误的强制类型转换
/* 测试代码 */
#include <stdio.h>
#include <malloc.h>
int main()
{
int* p1 = (int*)malloc(40);
int* p2 = (int*)1234567; // error 错误的强制类型转换
int i = 0;
for(i=0; i<40; i++)
{
*(p1 + i) = 40 - i; // error 错误的指针运算
}
free(p1);
for(i=0; i<40; i++)
{
p1[i] = p2[i]; // error 使用已经释放过的指针 p1
}
return 0;
}
常见内存错误
结构体成员指针未初始化
结构体成员指针未分配足够的内存
内存分配成功,但未初始化
内存操作越界
内存操作的基本原则
- 动态内存申请之后,应该立即检查指针值是否为NULL,防止使用NULL指针,防止使用NULL指针
int* p = (int*)malloc(56);
if(p != NULL)
{
//...........
}
free(p);
- free指针之后必须立即赋值为NULL
int* p = (int*)malloc(56);
free(p);
p = NULL;
- malloc 操作和 free 操作必须匹配,防止内存泄漏和多次释放
- 当malloc次数 多于 free时,产生内存泄漏
- 当malloc次数 少于 free时,程序可能崩溃
void func()
{
int* p = (int*)malloc(20);
free(p);
p = NULL;
}
int main()
{
int* p = (int*)malloc(30);
func();
free(p);
p = NULL;
}
绝不返回局部变量和局部数组的地址
任何变量在定义后必须0初始化
字符数组必须确认0 结束符后才能成为字符串
任何使用与内存操作相关的函数必须指定长度信息