C语言中的野指针如何避免

ops/2025/3/6 7:19:59/

野指针(Dangling Pointer)是指指向无效内存地址的指针,使用野指针会导致程序出现未定义行为,如程序崩溃、数据损坏等。以下为你详细介绍几种常见的野指针情况:

未初始化的指针

当你声明一个指针变量,但没有对其进行初始化时,该指针会包含一个随机的、不确定的值,它指向的内存地址是未知的。使用这样的指针进行读写操作会导致不可预测的结果。

示例代码

#include <stdio.h>int main() {int* ptr;  // 声明一个指针,但未初始化*ptr = 10; // 错误:使用未初始化的指针printf("%d\n", *ptr);return 0;
}

在上述代码中,ptr 没有被初始化,它的值是不确定的,直接对其解引用赋值会导致程序出现未定义行为。

指针所指向的内存被释放后继续使用

当使用 malloccalloc 或 realloc 等函数动态分配内存后,如果使用 free 函数释放了这块内存,而指针仍然保留着原来的内存地址,此时该指针就变成了野指针。如果继续使用这个指针,就会访问到已经被释放的内存。

示例代码

#include <stdio.h>
#include <stdlib.h>int main() {int* ptr = (int*)malloc(sizeof(int));if (ptr != NULL) {*ptr = 20;printf("%d\n", *ptr);free(ptr); // 释放内存// 此时ptr成为野指针*ptr = 30; // 错误:使用已经释放的内存printf("%d\n", *ptr);}return 0;
}

在上述代码中,调用 free(ptr) 释放了 ptr 所指向的内存,但之后又尝试对 ptr 解引用赋值,这会导致未定义行为。

指针超出了所指向对象的作用域

当指针指向一个局部变量,而该局部变量所在的函数执行完毕后,局部变量的内存会被自动释放。此时,指针就变成了野指针。

示例代码

#include <stdio.h>int* getPtr() {int num = 40;return &num; // 返回局部变量的地址
}int main() {int* ptr = getPtr();// 此时ptr成为野指针,因为num已经超出作用域printf("%d\n", *ptr); // 错误:使用超出作用域的变量地址return 0;
}

在上述代码中,getPtr 函数返回了局部变量 num 的地址,当 getPtr 函数执行完毕后,num 的内存被释放,ptr 就变成了野指针。

避免野指针的方法

  • 初始化指针:在声明指针时,将其初始化为 NULL,如果暂时不需要指向有效的内存地址,这样可以避免使用未初始化的指针。
  • 释放内存后将指针置为 NULL:在使用 free 函数释放内存后,将指针赋值为 NULL,这样可以避免再次使用该指针。
  • 注意作用域:确保指针在其指向的对象的作用域内使用,避免返回局部变量的地址。

http://www.ppmy.cn/ops/163531.html

相关文章

华为hcie证书有什么作用?

新盟教育 专注华为认证培训十余年 为你提供认证一线资讯&#xff01; 在当今数字化飞速发展的时代&#xff0c;ICT行业对专业人才的需求日益增长。华为HCIE证书作为华为认证体系中的最高级别认证&#xff0c;无疑是众多IT从业者追求的目标。那么&#xff0c;华为HCIE证书到底有…

探秘大尺寸 PCB 打样:猎板 PCB 解锁高精度制造密码

在当今电子产品的研发与生产领域&#xff0c;大尺寸PCB&#xff08;通常指尺寸超过600mm600mm的电路板&#xff09;凭借其强大的功能集成能力和广泛的特殊应用场景&#xff0c;逐渐成为行业关注的焦点。然而&#xff0c;其复杂的特性也对生产工艺提出了极为严苛的要求。猎板PCB…

Beyond Compare for mac v5.0.6.30713 文件对比利器 支持M、Intel芯片

Mac毒搜集到的Beyond Compare是一套超级的文件及文件夹(目录)的比较工具&#xff0c;不仅可以快速比较出两个目录的不同&#xff0c;还可以比较每个文件的内容&#xff0c;而且可以任意显示比较结果。 应用介绍 程序内建了文件浏览器&#xff0c;方便您对文件、文件夹、压缩包…

山东大学计算机科学与技术学院软件工程实验日志

--- Author: "Inori_333" Date: 2025-03-04 --- 实验一 团队建立、阅读开源软件 1.队伍创建与分工 队伍最终确定由5人组成&#xff0c;小组成员之间进行了高效的沟通&#xff0c;并确定了各自的负责的部分内容。 2.代码复现与分析 写在前面&#xff1a;由于“…

C++核心编程之Deque容器

&#x1f680; 深入浅出deque容器&#xff1a;双端队列的奇幻漂流 摘要&#xff1a;想拥有既能"头铁"插入数据&#xff0c;又能"尾行"删除元素的神奇容器吗&#xff1f;快来解锁STL中的瑞士军刀——deque容器&#xff01;本文用趣味比喻实战代码&#xff…

通义万相2.1:开启视频生成新时代

文章摘要&#xff1a;通义万相 2.1 是一款在人工智能视频生成领域具有里程碑意义的工具&#xff0c;它通过核心技术的升级和创新&#xff0c;为创作者提供了更强大、更智能的创作能力。本文详细介绍了通义万相 2.1 的背景、核心技术、功能特性、性能评测、用户反馈以及应用场景…

oracle服务器通过进程查找对应的sql语句

背景&#xff1a;公司业务侧DB服务器经常卡顿&#xff0c;编写简单的脚本去定时查找占用CPU或内存高的进程&#xff0c;并通过Top10的占用CPU进程找到可能对应的sql语句。 1、切换到oracle用户下&#xff0c;并新建一个放脚本的目录 </u2/oracle/product/12.2.0/dbhome_1&…

【TCP/IP协议栈】1. TCP/IP协议栈概述(体系、四/五层模型、IP、MAC)

个人学习记录&#xff0c;复习用&#xff0c;若侵删。 https://www.yuque.com/u41716106/ni1clp/pllgo1gkoyhcvf8w?singleDoc# 《【学习】1. TCP/IP协议栈概述&#xff08;体系、四/五层模型、IP、MAC&#xff09;》 参考资料&#xff1a; 网络通信协议 计算机网络的整体…