当前位置: 首页 > news >正文

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, 成因:指针越界访问:访问超出数组范围的地址时,指针指向非法内存

      预防:数组遍历是声明合适大小的的循环变量

相关文章:

  • 前端面试题-HTML篇
  • 「卫星百科」“绿色守卫”高分六号
  • 设计模式:观察者模式 - 实战
  • ElementUI表单验证指南
  • 如何让 Git 停止跟踪文件?停止后又如何恢复跟踪?
  • AU6815集成音频DSP的2x25W数字型ClaSS D音频功率放大器(替代TAS5805)
  • Docker部署项目无法访问,登录超时完整排查攻略
  • Triton推理服务器部署YOLOv8(onnxruntime后端和TensorRT后端)
  • 计算机网络全维度解析:架构协议、关键设备、安全机制与新兴技术深度融合
  • python里的NumPy算法
  • VSCode + GD32F407 构建烧录
  • Axure设计案例——科技感对比柱状图
  • React 编译器 RC
  • Java大师成长计划之第34天:开源项目参与与贡献指南
  • 已解决:.NetCore控制台程序(WebAPI)假死,程序挂起接口不通
  • R语言基础| 数据基本管理与操作
  • 【.net core】SkiaSharp 如何在Linux上实现
  • Axios 如何通过配置实现通过接口请求下载文件
  • docker运行centos提示Operation not permitted
  • 2023-ICLR-ReAct 首次结合Thought和Action提升大模型解决问题的能力
  • 网站建设的步骤教学/南京 seo 价格
  • 日本做爰动漫网站/新闻最近的大事10件
  • 国外怎么做推广网站/百度站长工具app
  • ip加端口可以做网站吗/如何引流推广
  • 视频剪辑软件/百度搜索关键词排名人工优化
  • 福州b2c网站建设/官网设计比较好看的网站