C程序中可怕的野指针图文详解

 更新时间:2019年07月18日 09:10:29   作者:石家的鱼  
这篇文章主要给大家介绍了关于C程序中可怕的野指针的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C程序具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

一、疑问点

指针是C语言一个很强大的功能,同时也是很容易让人犯错的一个功能,用错了指针,轻者只是报个错,重者可能整个系统都崩溃了。下面是大家在编写C程序时,经常遇到的一种错误的使用方法,也许在你的学习和工作中就是这样用的,很危险。

实例程序如图1所示:

图1 实例程序

这段程序比较简单,str1指向的内存区域存放了一个字符串“123”,把“123”赋值到str2指向的内存区域,编译时会给出一个告警:

local variable 'str2' used without having been initialized

意思是说,“str2”这个变量没有初始化。我们可以不理会这个告警,并且继续运行程

序,但是“str2”在定义时没有给初值,是一个野指针,程序运行的结果可能是非常可怕的。下面我们来详细分析下,野指针的可怕之处。

二、可怕的野指针

我们程序中的

strcpy(str2 , str1);
printf("str2指向的字符串是 %s",str2);

这两行代码注释掉,然后运行程序,看看str2输出的值是多少。

运行结果如下:

可见str2被系统赋予一个值3435973836,3435973836是一个内存的地址,也就是指针str2指向这段内存,这段内存上保存的数据可能是其他某个程序的数据,例如保存着“hello world!”,如图2所示,也可能什么数据也没有。

图2 其他程序的重要数据

如果这段内存保存着其他程序的重要数据,通过strcopy函数将“123”复制给了这段内存,也就是修改了这个重要数据,这段内存保存的数据变成了“123lo world!”,如图3所示,那么其他程序可能就崩掉了!

图3 其他程序的重要数据被改写

三、避免野指针的方法

为了防止野指针带来的灾难,建议指针在定义时给一个初值,比如“NULL”,意思是不指向任何内存地址。然后再使用malloc函数给指针分配一块存储空间。修改的程序如图4所示:

图4 避免野指针的改法程序

在定义str2时赋予初值“NULL”,这样str2就不会指向任何内存。再通过malloc函数,申请一段空的内存区域,也就是没有任何程序使用的内存区域,让str2指向这段空的内存区域,如图5所示,此时再把“123”赋值到这段空的内存区域,这样就安全了。程序的最后,再主动释放掉这段内存区域,让str2再次不指向任何区域。

图5 系统分配的内存区域

运行结果如图6所示:

图6 运行结果

由结果可见,系统分配的没有任何其他程序使用的内存地址是“2428680”。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。

相关文章

  • 一文带你了解Qt多线程的实现方式

    一文带你了解Qt多线程的实现方式

    这篇文章主要为大家详细介绍了Qt多线程的实现方式的相关知识,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-01-01
  • 深入探讨:main函数执行完毕后,是否可能会再执行一段代码?

    深入探讨:main函数执行完毕后,是否可能会再执行一段代码?

    本篇文章是对main函数执行完毕后,是否可能会再执行一段代码,进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 探讨:用两个栈实现一个队列(我作为面试官的小结)

    探讨:用两个栈实现一个队列(我作为面试官的小结)

    作为面试官的我,经常拿这道用两个栈实现一个队列的面试题来考面试者,通过对面试者的表现和反应,有一些统计和感受,在此做个小结
    2013-05-05
  • OpenCV选择图像中矩形区域并保存

    OpenCV选择图像中矩形区域并保存

    这篇文章主要为大家详细介绍了OpenCV选择图像中矩形区域并保存的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • C/C++ Qt TreeWidget 嵌套节点操作使用

    C/C++ Qt TreeWidget 嵌套节点操作使用

    本文主要介绍了TreeWidget的如何使用,实现对树形框多节点的各种操作,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • Opencv分水岭算法学习

    Opencv分水岭算法学习

    这篇文章主要为大家详细介绍了Opencv分水岭算法的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • 共用体的定义与应用详细解析

    共用体的定义与应用详细解析

    共同体的定义类似结构体,不过共同体的所有成员都在同一段内存中存放,起始地址一样,并且同一时刻只能使用其中的一个成员变量
    2013-08-08
  • 深入了解C语言中的const和指针

    深入了解C语言中的const和指针

    这篇文章将具体为大家介绍一下C语言中const和指针的使用,文中的示例代码讲解详细,对我们学习const和指针有一定帮助,需要的可以参考一下
    2022-02-02
  • C语言实现通讯管理系统设计

    C语言实现通讯管理系统设计

    这篇文章主要为大家详细介绍了C语言实现通讯管理系统设计,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • C语言每日练习之动态显示系统时间

    C语言每日练习之动态显示系统时间

    这篇文章主要介绍了C语言动态显示系统时,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-11-11

最新评论