什么是野指针:
野指针就是指针指向的位置是未知的(随机的、不正确的、未明确限制的)。
野指针1:指针变量的值未被初始化
如果指针声明在全局变量区,那么未初始化的指针缺省为空。
如果指针声明在栈区,那么该指针将随意指向一个地址空间。
void test() {
int* ptr; //野指针,编译器报错
if (ptr != NULL) {
}
}
野指针2: 指针所指向的地址空间已经被free或delete
在堆上malloc或者new申请的地址空间,如果已经free或delete,那么此时堆上的内存已经被释放,但是指向该内存的指针如果没有人为的修改过,那么指针还会继续指向这段堆上已经被释放的内存
void test() {
char* ptr = (char*)malloc(sizeof(char) * 64);
strcpy(ptr, "Hello!");
free(ptr); //此时ptr所指向的内存已经被释放,但是ptr指向的地址依然存在
//printf("%s", ptr); //出错,此时ptr为一个野指针
if (ptr != NULL) { //ptr指向的地址依然存在
strcpy(ptr, "Hello,Wang");
}
printf("%s", ptr); //输出:Hello,Wang
}
野指针3: 指针操作超越了作用域
超越了作用域,此时作用域里的内存已经被回收
//野指针3
void test3() {
int* ptr3 = NULL;
{
int a = 10;
ptr3 = &a;
}//a的作用域结束,a被回收
int b = *ptr3; //ptr3指向a,a被回收,此时ptr3为野指针
printf("%d", b);
}
解决办法:
1、初始化置NULL
2、申请内存后判空:malloc申请内存后判别是否为空
3、指针释放后置NULL