前言

在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. [Linux]U盘启动盘安装CentOS7系统(LiveGNOME版)

    1 准备:工具 U盘 容量:视CentOS具体版本需要而定.推荐4G+ UltraISO(软碟通) ISO制作工具 / U盘启动盘刻录工具 2 制作:U盘启动盘 step1 下载CentOS镜像 Ce ...

  2. 利用Nextcloud搭建私有同步云盘

    1. 简介 Nextcloud是一款开源免费的私有云存储网盘项目,可以让你快速便捷地搭建一套属于自己或团队的云同步网盘,从而实现跨平台跨设备文件同步.共享.版本控制.团队协作等功能.它的客户端覆盖了W ...

  3. AndroidApp加密数据明文抓取测试方法——hook方式

    0x00 前言 在做移动安全的app渗透或者说移动app的漏洞挖掘时,往往会碰到一种情况:好不容易绕过了app的反抓包机制,通过burp抓到了app传输的数据包,这时想对这部分数据做一些爆破.篡改之类 ...

  4. 安装kafka和zookeeper以及使用

    1.安装zookeeper zookeeper下载:http://zookeeper.apache.org/releases.html 从3.5.5开始,带有bin名称的包才是要下载的包可以直接使用 ...

  5. css 文本超出,显示省略号

    单行文本省略号 显示省略号     text-overflow: ellipsis;     overflow: hidden;     max-width: 110px; 文本不换行     wor ...

  6. MySQL中的Join 的算法(NLJ、BNL、BKA)

    本文已收录至Github,推荐阅读 Java随想录 微信公众号:Java随想录 目录 摘要 什么是Join Index Nested-Loop Join Block Nested-Loop Join ...

  7. 关于前端vue打包项目以及静态网站部署项目到阿里云ECS云服务器初学简单教程

    准备工作: 1.首先进入https://ecs.console.aliyun.com/ 领取或者购买一台简单的ECS云服务器. 进入网站注册登录后拉到页面最下面或者顶部搜索免费云服务器领取立即试用 , ...

  8. Vue2到Vue3的改变

    一.Vue2->Vue3 如果有Vue2的基础,并在此基础上学习Vue3,并不需要把完整的官网看完,我们只需要关注一下新功能和非兼容的变化即可进行开发. 二.Vue3变化 统一元素上使用的v-i ...

  9. redis内存突然暴增,排查思路是什么

    1 这种暴增的应该还是上次一个群友说的,更多可能是外部因素导致的,应用新上线,定时任务这些,再有就是cat上查是哪些指令多,以及比对和之前的时间的差异 看是否有定时任务 或者 新上线的活动 ,在看下监 ...

  10. 2022-11-23: 分数排名。输出结果和表的sql如下。请写出输出结果的sql语句? +-------+------+ | score | rank | +-------+------+ | 4.

    2022-11-23: 分数排名.输出结果和表的sql如下.请写出输出结果的sql语句? ±------±-----+ | score | rank | ±------±-----+ | 4.00 | ...