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

news/2024/11/16 18:43:44/

野指针的定义:

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

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

举例说明

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.ppmy.cn/news/1263342.html

相关文章

OpenCL不支持C++内核语言(设备语言)

在*.cl文件(或字符串)中不支持用class、template等! 在*.cl文件(或字符串)中不支持给struct定义构造函数或成员函数! 在*.cl文件(或字符串)中不支持函数默认参数,例如&…

java-自动生成数据库设计文档

目录 screw 官网介绍 screw 的特点: 目前支持的数据库有: 文档生成支持: 文档截图 html word 引入jar 生产代码 screw 官网介绍 https://gitee.com/leshalv/screw#https://gitee.com/link?targethttps://my.oschina.net/mdxlcj/b…

【wpf】handycontrol growl 打造一个比弹窗优雅10倍的信息通知方式

前言 话不多说,先上图: 这种弹框不会影响主进程的脚本,同时分为四个等级: 普通消息:Info (时间一到,自动消失,除非鼠标停留上面)警告: Warning &#xff0…

用stl写一个自动打分比赛的案例

我们要实现六名选手进行随机平均分为两组,先分别淘汰两组中的最后一名, 再决出第一名。 抽象选手 class player { public:string name;int score; }; 一个选手有名字和分数 首先我们需要vector容器保存选手的编号,便于后续的操作。 再用…

【Java】构建表达式二叉树和表达式二叉树求值

问题背景 1. 实现一个简单的计算器。通过键盘输入一个包含圆括号、加减乘除等符号组成的算术表达式字符串,输出该算术表达式的值。要求: (1)系统至少能实现加、减、乘、除等运算; (2)利用二叉…

【面试常考题目】五种方法解决“如何在n个无序数组中找出它的中位数(java)”问题

1.3 从N个数组中找到中位数,每一个数组可能乱序 在LeetCode上,"寻找多个数组的中位数"这类问题通常是由两个数组合并中位数问题(即LeetCode第4题)的变种或扩展。直接对应于多个数组合并后寻找中位数的题目在LeetCode上…

优化瑞芯微rk3566 tf卡速度uhs SDR104

环境 开发板:orangepi3B CPU:rk3566 TF卡速度标识:C10,U3,V30 起因 对于tf卡启动的系统来说,io会成为一个很关键的瓶颈,所以总希望系统能跑得快一点。我手头用的是一张金士顿的高性能tf卡,开…

Azure Machine Learning - 使用 Azure OpenAI 服务生成文本

使用 Azure OpenAI 服务生成文本 关注TechLead,分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理专业人士&…