前言

在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语言 | 指针陷阱-空指针与野指针的更多相关文章

  1. C语言指针2(空指针,野指针)

    //最近,有朋友开玩笑问 int *p  *是指针还是p是指针还是*p是指针,当然了,知道的都知道p是指针 //野指针----->>>指没有指向一个地址的指针(指针指向地址请参考上一 ...

  2. 逍遥自在学C语言 | 第一个C语言程序 九层之台起于垒土

    一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位上场的是和我们一起学习的小白程序猿 -- 逍遥. 二.C语言简介 C语言是一种高级语言,运行效率仅次于汇编,支持跨平 ...

  3. C++的空指针、野指针和指针赋值NULL.md

    1.空指针和野指针 http://blog.csdn.net/fu_zk/article/details/21030607 空指针常量 一个表示0值的整数常量,叫做空指针常量.例如:0.0L.1-1( ...

  4. Objective-C 空指针和野指针

    一.什么是空指针和野指针 1.空指针 1> 没有存储任何内存地址的指针就称为空指针(NULL指针) 2> 空指针就是被赋值为0的指针,在没有被具体初始化之前,其值为0. 下面两个都是空指针 ...

  5. 【Objective-C】-空指针和野指针

    一.什么是空指针和野指针 1.空指针 1> 没有存储任何内存地址的指针就称为空指针(NULL指针) 2> 空指针就是被赋值为0的指针,在没有被具体初始化之前,其值为0. 下面两个都是空指针 ...

  6. 浅谈 “空指针、野指针、void*”

            Author: JW. Zhou Date: 2014/7/2 一.空指针(0/NULL) 返回NULL和返回0是完全等价的,因为NULL和0都表示空指针,换句话说:空指针是什么,就是 ...

  7. C语言之free函数及野指针

    [FROM MSDN && 百科] 原型:  void free(void *ptr); #include<stdlib.h>或#include <malloc.h& ...

  8. 逍遥自在学C语言 | 算数运算符

    前言 一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位上场的是和我们一起学习的小白程序猿 -- 逍遥. 二.算数运算符简介 C语言的算数运算符,是用来完成基本的算术 ...

  9. 逍遥自在学C语言 | 逻辑运算符

    前言 一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位上场的是和我们一起学习的小白程序猿 -- 逍遥. 二.构成和表示方式 逻辑运算符是用来比较和操作布尔值的运算符 ...

  10. 逍遥自在学C语言 | 变量、常量与数据类型

    前言 一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位上场的是和我们一起学习的小白程序猿 -- 逍遥. 二.基本数据类型 1.整型 C语言中的整型数据如下表所示: ...

随机推荐

  1. 二进制安装Kubernetes(k8s) v1.24.1 IPv4/IPv6双栈 --- Ubuntu版

    二进制安装Kubernetes(k8s) v1.24.1 IPv4/IPv6双栈 --- Ubuntu版本 Kubernetes 开源不易,帮忙点个star,谢谢了 介绍 kubernetes二进制安 ...

  2. pandas之样本操作

    随机抽样,是统计学中常用的一种方法,它可以帮助我们从大量的数据中快速地构建出一组数据分析模型.在 Pandas 中,如果想要对数据集进行随机抽样,需要使用 sample() 函数.sample() 函 ...

  3. 部署:windows7下mysql8.0.18部署安装

    一.前期准备(windows7+mysql-8.0.18-winx64) 1.下载地址:https://dev.mysql.com/downloads/ 2.选择直接下载不登录账号,下载的压缩包大概两 ...

  4. 学会提示-AI时代职场必修课

    作者:京东 何雨航 " 上个时代要学会提问,这个时代要学会提示." 引言 当你在写提数代码时,小张已经完成了数据分析:当你正在整理材料时,小王却在和对象逛环球影城:述职时,你发现小 ...

  5. 理解Linux系统: 进程

    Linux内核版本: 2.6.11.12 编写代码: 创建进程 创建进程使用fork系统调用,官方文档对于fork的描述: fork() creates a new process by duplic ...

  6. springboot项目 宿舍管理系统 (源码+数据库文件+1w字论文+ppt)

    来了就点个赞再走呗,即将毕业的兄弟有福了文章底部获取源码springboot项目 宿舍管理系统 (源码+数据库文件+1w字论文+ppt)技术框架:java+springboot+vue+mysql后端 ...

  7. 33-webpack详细配置output

    const { resolve } = require('path') const HtmlWebpackPlugin = require('html-webpack-plugin') module. ...

  8. es6 新增 set 和 map数据结构以及应用场景

    https://www.cnblogs.com/sexintercourse/p/12269580.html Set数据容器,这是一个能够存储无重复值的有序列表. 1. 创建集合 set let se ...

  9. 如何在SpringBoot项目中兼容Jersey和SpringMVC框架?

    文章目录 Jersey框架介绍 常用的注解: SpringBoot中SpringMVC兼容Jersey 整合Jersey REST(Representational State Transfer)表象 ...

  10. Protobuf编码规则

    支持类型 该表显示了在 .proto 文件中指定的类型,以及自动生成的类中的相应类型: .proto Type Notes C++ Type Java/Kotlin Type[1] Java/Kotl ...