野指针产生的原因
- 指针变量和它所指向的内存空间是两个不同的概念
- 释放了指针所指的内存空间,但是指针变量本身没有重置成NULL
- 判断释放 通过if(p1!=NULL)
避免方法
- 定义指针的时候初始化成NULL
- 释放指针指向的内存空间后,把指针重置成NULL。
代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void main()
{
char *p1 = NULL; // p1栈中分配内存空间 NULL默认是0 p1的地址是0
p1 = (char *)malloc(100); // p1指向了堆中开辟的空间 叫 0xaa11吧 p1的地址变成了0xaa11
strcpy(p1, "123654"); // 把常量区的123654 拷贝到p1所指向的堆中空间
if (NULL == p1) {
return;
}
printf("p1:%s\n", p1);
if (p1 != NULL) {
free(p1); // 释放p1指向堆中的空间 但p1变量的地址还是0xaa11,乱指向了一个垃圾空间
p1 = NULL; // 必须要把p1的地址
}
/*
如果前面已经释放了,再free(p1)这里会有问题的,也就产生了野指针,解决办法:p1=NULL
*/
if (p1 != NULL) {
free(p1);
}
system("pause");
return;
}