逍遥自在学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语言中的整型数据如下表所示: ...
随机推荐
- JAVA基础——常用类(一)
首先认识到--String是不可以变性(final) String:字符串,使用一对""引起来表示. * 1.String声明为final的,不可被继承 * ...
- GitHub+Hexo 搭建博客网站
Hexo是一款基于Node.js的静态博客框架,依赖少易于安装使用,可以方便的生成静态网页托管在GitHub和Heroku上,是搭建博客的首选框架. 配置Github root@hello:~/cby ...
- Zabbix_sender基础命令浅析
zabbix_sender是Zabbix监控系统中用于向Zabbix服务器发送数据的命令行工具.以下是zabbix_sender基础命令教学: 语法: zabbix_sender -z <ser ...
- 【Vue项目】尚品汇(六)ShopCar组件开发 购物车模块
4 购物车 4.1 购物车商品数量控制 Detail\index.vue <div class="cartWrap"> <div class="cont ...
- Restless API 与 Restful API
Restful API: 1.CURD(增删改查) 由请求方式决定 2.请求方式有:get/post/delete/put 3.同一个路径可以进行多个操作 Restless API 1.CURD(增 ...
- Go语言核心知识回顾(接口、Context、协程)
温故而知新 接口 接口是一种共享边界,计算机系统的各个独立组件可以在这个共享边界上交换信息,在面向对象的编程语言,接口指的是相互独立的两个对象之间的交流方式,接口有如下好处: 隐藏细节: 对对象进行必 ...
- Caused by: java.net.BindException: Address already in use: JVM_Bind(ActiveMq已经启动)
1.本地启动项目开启两个启动类出错. Error creating bean with name 'brokerService' defined in class path resource [com ...
- Java的初始化块
三种初始化数据域的方法: 在构造器中设置值 在声明中赋值 初始化块(initialization block) 初始化块 在一个类的声明中,可以包含多个代码块.只要构造类的对象,这些块就会被执行. c ...
- InnoSetup打包 添加.NET环境安装
这是封装出来的针对.NET环境安装的精简流程 根据流程新建一个配置文件 教程都是很简单的,可以参考<InnoSetup 客户端程序打包教程> 添加.NET安装基本的函数及辅助方法 在[Se ...
- [C++基础入门] 4、 程序流程结构
文章目录 4 程序流程结构 4.1 选择结构 4.1.1 if语句 4.1.2 三目运算符 4.1.3 switch语句 4.2 循环结构 4.2.1 while循环语句 4.2.2 do...whi ...