C语言中野指针问题
一、什么是野指针
野指针:
是指向无效或未定义内存地址的指针,其值通常是随机的、不确定的,可能指向已被释放的内存、未初始化的区域或非法地址
。与空指针(NULL)不同,野指针本身并不是NULL,而是指向无法正常访问的内存空间,操作野指针可能导致程序崩溃或数据损坏
二、野指针与空指针的区别
特征 野指针 空指针(NULL)
定义 指向无效或随机地址的指针 显式赋值为NULL的指针
安全性 危险,可能导致崩溃或错误 安全,解引用会明确报错
成因 未初始化、释放后未置空等 开发者主动赋值NULL
处理方式 需通过初始化或置空规避 可通过条件判断避免误用
三、代码示例
#include <stdio.h>
#include <stdlib.h>/*
1.返回局部变量的地址:函数返回局部变量的地址时,局部变量生命周期结束后内存会被回收
int* test() {int n = 100;return &n; // 返回局部变量地址
}
int* p = test(); // p成为野指针
改正:改用动态内存分配或静态变量:
*/
int* getIntPointer(int value) {static int* size = NULL;int* ptr = malloc(sizeof(int));if (ptr == NULL) {fprintf(stderr, "Memory allocation failed\n");return NULL;}*ptr = value;return ptr,size;
}int main()
{//野指针的成因// 2.指针未初始化:此时p指向未知区域,解引用可能导致段错误//int* p; // 未初始化,p为野指针//*p = 10; // 非法访问随机地址// 改正:1、未明确指向时初始化为NULL// 2、显式赋值有效地址:int *p = &valid_varint* p = NULL;// 3.指针指向已释放的内存//int* p = (int*)malloc(sizeof(int));//free(p); // 释放内存//*p = 20; // p仍指向已释放的地址,成为野指针// 改正:释放内存后置空指针int* p2 = (int*)malloc(sizeof(int));if (p2==NULL) {printf("内存分配失败\n");return -1;}else {printf("内存分配成功\n");*p2 = 20; // 正确访问已分配的内存p2 = NULL; // 释放后置空}// 4.指针越界访问:访问超出数组范围的地址时,指针指向非法内存://int arr[10] = {0};//int* p = arr;//for (int i = 0; i <= 11; i++) {// *(p++) = i; // 越界后p成为野指针//}// 改正int arr[10] = {0};int* arr_p = arr;for (int i = 0; i <= 11; i++) {*(arr_p++) = i; // 越界后p成为野指针}return 0;
}
四、野指针的成因及预防方法
1,成因:返回局部变量的地址:函数返回局部变量的地址时,局部变量生命周期结束后内存会被回收
预防:改用动态内存分配或静态变量
2, 成因:指针未初始化:此时p指向未知区域,解引用可能导致段错误
预防:
a、未明确指向时初始化为NULL
b、显式赋值有效地址:int *p = &valid_var
3,成因:指针指向已释放的内存
预防: 释放内存后置空指针
4, 成因:指针越界访问:访问超出数组范围的地址时,指针指向非法内存
预防:数组遍历是声明合适大小的的循环变量