逍遥自在学C语言 | 指针陷阱-空指针与野指针
前言
在C语言中,指针是一种非常强大和灵活的工具,但同时也容易引发一些问题,其中包括空指针和野指针。
本文将带你了解这两个概念的含义、产生原因以及如何避免它们所导致的问题。
一、人物简介
- 第一位闪亮登场,有请今后会一直教我们C语言的老师 —— 自在。
- 第二位上场的是和我们一起学习的小白程序猿 —— 逍遥。
二、空指针
空指针是指不指向任何有效内存地址的指针。
在C语言中,可以用NULL宏来表示空指针。
当一个指针被赋值为NULL时,它不指向任何有效的内存位置。
下面是一个示例代码,演示了如何使用空指针:
#include <stdio.h>
int main() {
int *ptr = NULL; // 声明一个指向整数的空指针
if (ptr == NULL) {
printf("指针为空。\n");
} else {
printf("指针不为空。\n");
}
return 0;
}
- 输出结果:
指针为空。
在上述代码中,我们声明了一个指向整数的空指针
ptr
,并将其赋值为NULL。然后,我们使用条件语句检查指针是否为空,并打印相应的消息。
三、野指针
野指针是指指向未知、无效或已释放的内存位置的指针。
当一个指针被赋值为未初始化的值、已经释放的内存地址,或者指向一个不再有效的对象时,它就成为了野指针。
下面是一个示例代码,演示了野指针的行为:
#include <stdio.h>
int main() {
int *ptr; // 未初始化的指针
*ptr = 42; // 野指针的解引用
printf("野指针的值: %d\n", *ptr);
return 0;
}
- 输出结果:
Segmentation fault
在上述代码中,我们声明了一个未初始化的指针
ptr
,然后尝试对其进行解引用并赋值。由于该指针没有指向任何有效的内存地址,这将导致程序崩溃并引发段错误。
四、空指针和野指针的产生
空指针和野指针的产生主要源于以下几种情况:
1、空指针的产生
- 在声明指针时将其初始化为NULL:当我们声明一个指针但没有为其分配有效的内存地址时,可以将其初始化为NULL,表示该指针不指向任何有效的内存位置。
- 在释放内存后未将指针置为NULL:当我们释放了一个指针所指向的内存后,为了避免野指针的产生,应该将指针设置为NULL。否则,该指针将继续指向已经释放的内存位置,成为野指针。
2、 野指针的产生
- 未初始化的指针:当我们声明一个指针但未对其进行初始化时,该指针的值是未知的。
- 已释放的内存地址:当我们释放了一块内存后,如果仍然持有指向该内存地址的指针,并且对该指针进行解引用操作,就会导致野指针的产生。
- 指向超出作用域的局部变量:当一个指针指向了超出其所在作用域的局部变量时,当该指针被使用时就会产生野指针。这是因为当函数返回后,局部变量的内存将不再有效,但指针仍然保持指向该内存地址。
五、 空指针和野指针导致的问题
空指针和野指针可能导致以下问题:
- 程序崩溃:当野指针被解引用时,访问无效的内存位置可能导致程序崩溃,并引发诸如段错误等的运行时错误。
- 内存泄漏:如果指针被设置为指向一块已释放的内存,这将导致内存泄漏。内存泄漏会消耗系统资源,并可能导致程序性能下降或崩溃。
- 无法预测的行为:对空指针或野指针进行解引用操作会导致不可预测的行为,因为访问的内存位置是未知的。
六、避免产生野指针的方法
- 初始化指针变量:在声明指针变量后,确保及时为其分配有效的内存地址。
- 及时释放内存并置空指针:在不再需要使用某个指针指向的内存时,及时释放该内存,并将指针设置为NULL。
- 避免越过作用域使用指针:确保指针不会超出其所在作用域范围。当指针指向局部变量时,确保在变量超出作用域前不再使用该指针。
- 注意指针的生命周期:在使用指针时,了解指针所指向的对象的生命周期。确保指针只在对象有效的时间段内使用,并在对象失效后避免使用指针。
小结
通过这篇文章,我们学会了
1、空指针的概念
2、野指针的概念
3、空指针和野指针的产生
4、空指针和野指针导致的问题,避免野指针产生的方法。
欢迎各位 点赞 收藏 评论,如有错误请留言指正,非常感谢!
逍遥自在学C语言 | 指针陷阱-空指针与野指针的更多相关文章
- C语言指针2(空指针,野指针)
//最近,有朋友开玩笑问 int *p *是指针还是p是指针还是*p是指针,当然了,知道的都知道p是指针 //野指针----->>>指没有指向一个地址的指针(指针指向地址请参考上一 ...
- 逍遥自在学C语言 | 第一个C语言程序 九层之台起于垒土
一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位上场的是和我们一起学习的小白程序猿 -- 逍遥. 二.C语言简介 C语言是一种高级语言,运行效率仅次于汇编,支持跨平 ...
- C++的空指针、野指针和指针赋值NULL.md
1.空指针和野指针 http://blog.csdn.net/fu_zk/article/details/21030607 空指针常量 一个表示0值的整数常量,叫做空指针常量.例如:0.0L.1-1( ...
- Objective-C 空指针和野指针
一.什么是空指针和野指针 1.空指针 1> 没有存储任何内存地址的指针就称为空指针(NULL指针) 2> 空指针就是被赋值为0的指针,在没有被具体初始化之前,其值为0. 下面两个都是空指针 ...
- 【Objective-C】-空指针和野指针
一.什么是空指针和野指针 1.空指针 1> 没有存储任何内存地址的指针就称为空指针(NULL指针) 2> 空指针就是被赋值为0的指针,在没有被具体初始化之前,其值为0. 下面两个都是空指针 ...
- 浅谈 “空指针、野指针、void*”
Author: JW. Zhou Date: 2014/7/2 一.空指针(0/NULL) 返回NULL和返回0是完全等价的,因为NULL和0都表示空指针,换句话说:空指针是什么,就是 ...
- C语言之free函数及野指针
[FROM MSDN && 百科] 原型: void free(void *ptr); #include<stdlib.h>或#include <malloc.h& ...
- 逍遥自在学C语言 | 算数运算符
前言 一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位上场的是和我们一起学习的小白程序猿 -- 逍遥. 二.算数运算符简介 C语言的算数运算符,是用来完成基本的算术 ...
- 逍遥自在学C语言 | 逻辑运算符
前言 一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位上场的是和我们一起学习的小白程序猿 -- 逍遥. 二.构成和表示方式 逻辑运算符是用来比较和操作布尔值的运算符 ...
- 逍遥自在学C语言 | 变量、常量与数据类型
前言 一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位上场的是和我们一起学习的小白程序猿 -- 逍遥. 二.基本数据类型 1.整型 C语言中的整型数据如下表所示: ...
随机推荐
- Redis集群介绍及测试思路
作者:京东零售 李磊 Redis集群介绍 Redis集群一般有四种方式,分别为:主从复制.哨兵模式.Cluster以及各大厂的集群方案.在3.0版本之前只支持单实例模式,3.0之后支持了集群方式.在3 ...
- 学习关于JavaScript常用的8大设计模式
JavaScript 常用的8大设计模式有 工厂模式:工厂模式是一种创建对象的模式,可以通过一个共同的接口创建不同类型的对象,隐藏了对象的创建过程. 单例模式:单例模式是一种只允许实例化一次的对象模式 ...
- 5.mapper出错原因
1.总结:前个星期mapper出错,很大原因是自己的项目结构创建有问题,大项目下应该是spring init那种项目结构形式,但是在创建多模块的时候应该是使用moudle形式的项目结构: 所以自己在运 ...
- 关于react的Tabs组件中TabPane的bug
今天解决了我自认为一个很不起眼的Bug. 我的Tabs下面有5个tabPane,并且这几个tabPane共用了一个search组件,今天遇到了一个bug,就是这几个组件使用公共查找组件的时候,前一个组 ...
- Podman Desktop安装与使用-Windows10
Podman Desktop安装与使用-Windows10 下载 containers/podman 地址 Podman Desktop Downloads 地址 我这里演示的是podman-v4.4 ...
- [MAUI]模仿微信“按住-说话”的交互实现
@ 目录 创建页面布局 创建手势控件 创建TalkBox 创建动画 拖拽物动画 按钮激活动画 TalkBox动画 Layout动画 项目地址 .NET MAUI跨平台框架包含了识别平移手势的功能,在之 ...
- 《简化iOS APP上架流程,App Uploader助你搞定!》
转载;http://kxdang.com/topic/appuploader/questions.html Appuploader 常见错误及解决方法 问题解决秘籍 遇到问题,第一个请登录苹果开发 ...
- 数据结构(DataStructure)-02
数据结构-02 **数据结构-01回顾** **数据结构-02笔记** **作业讲解** **链表作业题一** **链表作业题二** **链表作业题三** **线性表 - 栈(LIFO)** **线性 ...
- [OpenCV-Python] 15 图像阈值
文章目录 OpenCV-Python:IV OpenCV中的图像处理 15 图像阈值 15.1 简单阈值 15.2 自适应阈值 15.3 Otsu' 's 二值化 15.4 Otsu' 's 二值化是 ...
- ubuntu20安装docker、redis、mysql及部署net6应用
一.更新系统软件包索引 sudo apt update 二.安装docker sudo apt install docker.io 三.在docker中安装Mysql 拉取mysql镜像 docker ...