野指针
(1)指针变量中的值是非法的内存地址,进而形成野指针
(2)野指针不是NULL指针,是指向不可用内存的地址的指针
(3)NULL指针并无危害,很好判断,也很好调试
(4)C语言中无法判断一个指针所保存的地址是否合法
野指针:
(1)除了保存变量地址的指针和malloc的指针,其他是野指针
(2)指针指向malloc申请的地址空间,通过free释放调后变成野指针
野指针的由来:
(1)局部指针变量没有被初始化
(2)指针所执行的变量在指针之前被销毁
(3)使用已经释放的指针
(4)进行了错误的指针运算
(5)进行了错误的强制类型转换 //将变量值强制转换为指针地址值
实例分析:野指针初探
#include <stdio.h>
#include <malloc.h>
int main()
{
int* p1 = (int*)malloc(40); //申请40字节内存空间
int* p2 = (int*)1234567; //野指针
int i = 0;
printf("%p\n",p1);
for(i = 0; i < 40; i++)
{
*(p1 + i) = 40 - i; //指针加1移动4个字节,超过申请的内存空间,内存越界,改写非法的内存地址,野指针
}
free(p1); //野指针,free函数只负责释放指针指向的内存空间,但不负责将指针重置为NULL指针或者重置为任何的地址值
p1 = NULL; //必须将释放过后的野指针赋值为NULL
printf("%p\n",p1);
for(i = 0; i < 40; i++)
{
p1[i] = p2[i]; //使用已经释放的内存空间
}
return 0;
}
基本原则:
(1)绝不返回****局部变量和局部数组的地址
(2)任何变量在定义后必须0初始化
(3)字符数组必须确认0结束符后才能成为字符串
(4)任何使用与内存相关的函数必须指定长度信息
实例分析:无处不在的野指针
#include <stdio.h>
#include <string.h>
#include <malloc.h>
struct Student
{
char* name;
int number;
};
char* func()
{
char p[] = "I love you";
return p;
}
void del(char* p)
{
printf("%p\n", p);
free(p);
}
int main()
{
struct Student s; //由于没有初始化,产生野指针
char* p = func(); //产生了野指针
strcpy(s.name, p); //使用了野指针
s.number = 99;
p = (char*)malloc(5);
strcpy(p, "I LOVE YOU"); //产生内存越界,本质是操作了野指针所指向的内存空间
del(p);
return 0;
}