当前位置: 首页 > 编程笔记 >

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

许鸿志
2023-03-14
本文向大家介绍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中的一个著名的谜之特性,我会试着通过教授你一些用于处理它们的词汇,使之去神秘化。指针实际上并不复杂,只不过它们经常以一些奇怪的方式被滥用,这样使它们变得难以使用。如果你避免这些愚蠢的方法来使用指针,你会发现它们难以置信的简单。 要想以一种我们可以谈论的方式来讲解指针,我会编写一个无意义的程序,它以三种方式打印了一组人的年龄: #include <stdio.h> int main(int

  • 指针变量也是变量,是变量就可以任意赋值,不要越界即可(32位编译器指针大小为4字节,64位编译器指针大小为8字节),但是,任意数值赋值给指针变量没有意义,因为这样的指针就成了野指针,此指针指向的区域是未知(操作系统不允许操作此指针指向的内存区域)。所以,野指针不会直接引发错误,操作野指针指向的内存区域才会出问题。 int a = 100; int *p; p = a; //把a的值赋值给指针变量p

  • 本文向大家介绍图文详解c/c++中的多级指针与多维数组,包括了图文详解c/c++中的多级指针与多维数组的使用技巧和注意事项,需要的朋友参考一下 前言 首先先声明一些常识,如果你对这些常识还不理解,请先去弥补一下基础知识:      1、实际上并不存在多维数组,所谓的多维数组本质上是用一维数组模拟的。      2、数组名是一个常量(意味着不允许对其进行赋值操作),其代表数组首元素的首地址。    

  • 本文向大家介绍详解C语言中的常量指针和指针常量,包括了详解C语言中的常量指针和指针常量的使用技巧和注意事项,需要的朋友参考一下 概述 对于新手来说,指针在c语言里总是一个非常难以理解的概念。在这篇文章中,我们将解释常量指针,指针常量,const pointer to const(ps:楼主以为这可以翻译成指向常量的常量指针)的区别 常量指针 让我们先来理解什么是常量指针。常量指针是指指针指向的地址

  • 本文向大家介绍C迷途指针详解,包括了C迷途指针详解的使用技巧和注意事项,需要的朋友参考一下 本文较为详尽的讲述了C语言的迷途指针,分析了其概念、原理与检测方法。分享给大家供大家参考。具体如下: 一般来说,在计算机编程领域中,迷途指针,或称悬空指针、野指针,指的是不指向任何合法的对象的指针。 当所指向的对象被释放或者收回,但是对该指针没有作任何的修改,以至于该指针仍旧指向已经回收的内存地址,此情况下

  • 问题内容: 我是Java菜鸟。我已经掌握了将C / C ++指针转换为Java引用的概念,并且进展相当顺利。 我打了一段有指针的代码(即* ptr)。我需要取消引用指针并更改其指向的指针的值(即 ptr =&newthing;) 在Java中这似乎要困难得多。是否有人对如何解决此问题有任何想法?快速谷歌搜索什么都没有。 这是C ++中的代码示例。我想在Java中获得类似的工作,但是ptr_to_p