c语言:理解和避免野指针

野指针的定义:

野指针是指一个指针变量存储了一个无效的地址,通常是一个未初始化的指针或者指向已经被释放的内存地址。当程序尝试使用野指针时,可能会导致程序崩溃、内存泄漏或者其他不可预测的行为。因此,在编程中需要特别注意指针的初始化和内存的释放,以避免出现野指针问题。

我用自己的语言解释一下:假设你有一个指针变量,它应该指向一个有效的内存地址,比如一个变量或者对象。但是有时候,这个指针可能没有被正确初始化,或者指向的内存地址已经被释放了。这样的指针就被称为野指针。

举例说明

1.未初始化的指针:

当一个指针变量未被明确初始化时,它会包含一个随机的内存地址,这可能会导致它成为野指针。

int *ptr;
*ptr = 5;  // 未初始化的ptr指针成为野指针

正确写法:初始化指针并分配内存

int *ptr = malloc(sizeof(int));
*ptr = 5;
// 使用ptr
free(ptr); // 在不需要指针指向的内存时释放内存

2.指针指向已释放的内存:

当指针指向的内存已经被释放,但指针仍然保留着这个地址。

int *ptr = malloc(sizeof(int));
free(ptr);
*ptr = 10;  // ptr指向的内存已经被释放,ptr成为野指针

正确写法:使用静态或动态分配的内存,确保指针不指向已释放的内存

int *ptr = malloc(sizeof(int));
*ptr = 5;
// 使用ptr
free(ptr); // 在不需要指针指向的内存时释放内存
ptr = NULL; // 将指针设置为NULL,以避免成为野指针

3.指针指向超出作用域的局部变量:

当指针指向一个局部变量,并且在该变量的作用域之外被访问时,会导致野指针问题。

int *createInt() 
{int num = 10;return #
}int main() 
{int *ptr = createInt();*ptr = 20;  // createInt函数返回的指针指向了已经超出作用域的局部变量num,ptr成为野指针
}

正确写法:避免指针指向超出作用域的局部变量。

int *createInt() 
{int *num = malloc(sizeof(int));*num = 10;return num;
}int main() 
{int *ptr = createInt();*ptr = 20;// 使用ptrfree(ptr); // 在不需要指针指向的内存时释放内存
}

 4.指针指向未分配的内存:

当指针指向未分配内存的地址时,会导致野指针问题。

int *ptr = NULL;
*ptr = 5;  // ptr指向未分配的内存,成为野指针

正确写法:指针指向未分配的内存时需要先分配内存再使用。

int *ptr = malloc(sizeof(int));
*ptr = 5;
// 使用ptr
free(ptr); // 在不需要指针指向的内存时释放内存

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/211578.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pandas中DataFrame对象的创建与常用属性方法(第2讲)

Pandas中DataFrame对象的创建与常用属性方法(第2讲)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔…

智能优化算法应用:基于孔雀算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于孔雀算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于孔雀算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.孔雀算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

[足式机器人]Part2 Dr. CAN学习笔记-数学基础Ch0-2 特征值与特征向量

本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记-数学基础Ch0-2 特征值与特征向量 1. 定义1.1 线性变换1.2 求解特征值,特征向量1.3 应用:对角化矩阵——解耦Decouple 2. Summary 1. 定义 A v ⃗ λ v ⃗ A\vec{v}\lambd…

【网络奇缘】- 计算机网络|深入学习物理层|网络安全

​ 🌈个人主页: Aileen_0v0🔥系列专栏: 一见倾心,再见倾城 --- 计算机网络~💫个人格言:"没有罗马,那就自己创造罗马~" 回顾链接:http://t.csdnimg.cn/ZvPOS 这篇文章是关于深入学习原理参考模型-物理层的相关知识点&…

Linux权限命令详解

Linux权限命令详解 文章目录 Linux权限命令详解一、什么是权限?二、权限的本质三、Linux中的用户四、linux中文件的权限4.1 文件访问者的分类(人)4.2 文件类型和访问权限(事物属性) 五、快速掌握修改权限的做法【第一种…

实战1-python爬取安全客新闻

一般步骤:确定网站--搭建关系--发送请求--接受响应--筛选数据--保存本地 1.拿到网站首先要查看我们要爬取的目录是否被允许 一般网站都会议/robots.txt目录,告诉你哪些地址可爬,哪些不可爬,以安全客为例子 2. 首先测试在不登录的…

Docker Network(网络)——8

目录: Docker 为什么需要网络管理Docker 网络架构简介 CNMLibnetwork驱动常见网络类型 bridge 网络host 网络container 网络none 网络overlay 网络docker 网络管理命令 docker network createdocker network inspectdocker network connectdocker network disconne…

class072 最长递增子序列问题与扩展【算法】

class072 最长递增子序列问题与扩展【算法】 code1 300. 最长递增子序列 // 最长递增子序列和最长不下降子序列 // 给定一个整数数组nums // 找到其中最长严格递增子序列长度、最长不下降子序列长度 // 测试链接 : https://leetcode.cn/problems/longest-increasing-subsequen…

你知道MySQL中 group by 怎么优化吗

更好的阅读体验,请点击 YinKai s Blog。 ​ 在 MySQL 中 group by 用于按照一个或多个列对结果集进行分组。在讨论 group by 怎么优化之前,我们先来看看 group by 的执行流程,这样我们才能对症下药。 group by 执行流程 ​ 我们先用下面的 …

Ubuntu 18.04使用Qemu和GDB搭建运行内核的环境

安装busybox 参考博客: 使用GDBQEMU调试Linux内核环境搭建 一文教你如何使用GDBQemu调试Linux内核 ubuntu22.04搭建qemu环境测试内核 交叉编译busybox 编译busybox出现Library m is needed, can’t exclude it (yet)的解释 S3C2440 制作最新busybox文件系统 https:…

2024年网络安全竞赛-Web安全应用

Web安全应用 (一)拓扑图 任务环境说明: 1.获取PHP的版本号作为Flag值提交;(例如:5.2.14) 2.获取MySQL数据库的版本号作为Flag值提交;(例如:5.0.22) 3.获取系统的内核版本号作为Flag值提交;(例如:2.6.18) 4.获取网站后台管理员admin用户的密码作为Flag值提交…

udp多播组播

import socket ,struct,time# 组播地址和端口号 MCAST_GRP 239.0.0.1 MCAST_PORT 8888 # 创建UDP socket对象 sock socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) # 绑定socket对象到本地端口号 # sock.bind((MCAST_GRP, MCAST_PORT)) …

【4】PyQt输入框

1. 单行文本输入框 QLineEdit控件可以输入单行文本 from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit, QVBoxLayout from PyQt5.QtCore import * from PyQt5.QtGui import QIcon import sysdef init_widget(w: QWidget):# 修改窗口标题w.setWindowTitle(单行输…

前端面试——CSS面经(持续更新)

1. CSS选择器及其优先级 !important > 行内样式 > id选择器 > 类/伪类/属性选择器 > 标签/伪元素选择器 > 子/后台选择器 > *通配符 2. 重排和重绘是什么?浏览器的渲染机制是什么? 重排(回流):当增加或删除dom节点&…

【面试经典150 | 二叉树】从中序与后序遍历序列构造二叉树

文章目录 写在前面Tag题目来源题目解读解题思路方法一:递归 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更…… 专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等内容…

Android : Room 数据库的基本用法 —简单应用

1.Room介绍: Android Room 是 Android 官方提供的一个持久性库,用于在 Android 应用程序中管理数据库。它提供了一个简单的 API 层,使得使用 SQLite 数据库变得更加容易和方便。 以下是 Android Room 的主要特点: 对象关系映射…

9.MySQL 索引

目录 ​​​​​​​概述 概念: 单列索引 普通索引 创建索引 查看索引 删除索引 唯一索引 创建唯一索引 删除唯一索引 主键索引 组合索引 创建索引 全文索引 概述 使用全文索引 空间索引 内部原理 相关算法: hash算法 二叉树算法 …

Spring基于XML文件配置AOP

AOP AOP,面向切面编程,是对面向对象编程OOP的升华。OOP是纵向对一个事物的抽象,一个对象包括静态的属性信息,包括动态的方法信息等。而AOP是横向的对不同事物的抽象,属性与属性、方法与方法、对象与对象都可以组成一个…

12.10多种编码方式,编码方案选择策略(递归级联),PDE,RLE代码

作者如何选择和设计编码方案,以实现高效的解压缩和高压缩比?BtrBlocks是否适用于所有类型的数据? 选择和设计编码方案: 结合多种高效编码方案:BtrBlocks 通过选择一组针对不同数据分布的高效编码方案,实现…