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”。

总结

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

相关文章

  • C语言中条件编译详解

    C语言中条件编译详解

    预处理程序提供了条件编译的功能。可以按不同的条件去编译不同的程序部分,因而产生不同的目标代码文件。这对于程序的移植和调试是很有用的。条件编译有三种形式,下面分别介绍。
    2017-05-05
  • linux内核select/poll,epoll实现与区别

    linux内核select/poll,epoll实现与区别

    这篇文章主要介绍了linux内核select/poll,epoll实现与区别,需要的朋友可以参考下
    2016-11-11
  • c++实现二路归并排序的示例代码

    c++实现二路归并排序的示例代码

    这篇文章主要介绍了c++实现二路归并排序的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • C语言 函数指针(指向函数的指针)详解

    C语言 函数指针(指向函数的指针)详解

    本文主要介绍 C语言函数指针的知识,这里整理了详细的资料及示例代码以便大家学习参考,有需要学习此部分知识的朋友可以参考下
    2016-08-08
  • c语言B树深入理解

    c语言B树深入理解

    B树是为磁盘或其他直接存储设备设计的一种平衡查找树,本文将详细介绍c语言B树,需要的朋友可以参考下
    2012-11-11
  • c语言printf函数的使用详解

    c语言printf函数的使用详解

    本篇文章是对c语言中printf函数的使用进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • vscode C++远程调试运行(学习C++用)

    vscode C++远程调试运行(学习C++用)

    这篇文章主要介绍了vscode C++远程调试运行(学习C++用),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • C语言求两个字符串的最长公共子串

    C语言求两个字符串的最长公共子串

    这篇文章主要介绍了C语言求两个字符串的最长公共子串,实例分析了C语言操作字符串的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • C/C++杂记 虚函数的实现的基本原理(图文)

    C/C++杂记 虚函数的实现的基本原理(图文)

    这篇文章主要介绍了C/C++杂记 虚函数的实现的基本原理(图文),需要的朋友可以参考下
    2016-06-06
  • 70行C语言代码实现贪吃蛇

    70行C语言代码实现贪吃蛇

    这篇文章主要为大家详细介绍了70行C语言代码实现贪吃蛇,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03

最新评论