1、什么是野指针
野指针:就是指针指向的位置是不可知(随机性,不正确性,没有明确限制的)
int* a; //野指针
printf("%p", a); //报错
2、野指针的形成原因
(1)指针未初始化
int* a; //野指针
printf("%p", a); //报错
(2)指针越界访问
int arr[3] = { 1,2,3 };
for (int i = 0;i <= 3;i++) {
printf("%d %p\n", arr[i], &arr[i]); //不报错,但不对,因为下标越界了
}
(3)指针指向空间的释放后未置为NULL
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>//问题3
int* fn() {
int a = 10;
return &a;
}int main() {
int* p = fn(); //p为野指针
printf("%p ", p); //打出的地址可能是缓冲区中暂存的,其实是不对的
printf("%d \n", *p); //-858993460
//问题3-解决方法
int* p1 = fn1();
printf("%p ", p1);
printf("%d \n", *p1); //10return 0;
}
(4)动态申请空间(malloc <stdlib.h>)用完了,没有手动释放
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>//问题4
int* fn2() {
int* ptr = (int*)malloc(5 * sizeof(int));
if (ptr == NULL) {
printf("空间申请失败");
return NULL;
}
printf("空间申请成功");
*ptr = 10;
return ptr;
}
int main() {int* p2 = fn2();
printf("%p ", p2);
printf("%d ", *p2);
free(p1); //释放内存
return 0;
}
3、如何避免和解决野指针问题
(1)在定义指针时,要么将其初始化为一个合理的地址,要么初始化为NULL
(2)不让越界,注意数组下标
(3)使用静态变量static
(4)使用free(C)、delete(C++)释放内存
2107

被折叠的 条评论
为什么被折叠?



