`
kelehaier
  • 浏览: 5187 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

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语言指针练习填空和阅读程序题

    通过指针可以实现各种程序设计,例如,交换两个变量的值、查找数组中的最大值或最小值、字符串的处理等。 六、指针的应用 指针的应用非常广泛,例如,在数据结构中,指针可以用来实现链表、树、图等数据结构。在...

    MFC指针式时钟程序

    在MFC应用程序中,CWinApp类代表整个应用程序,CWnd类是所有窗口对象的基类,而CDialog类则用于创建对话框。 创建MFC指针式时钟程序的第一步是建立一个新的MFC AppWizard项目。在Visual C++ 6.0中,选择“File”->...

    c++野指针的原理以及避免方法

    C++中的野指针是指那些指向未知或非法内存地址的指针,它们可能是未初始化的,或者是曾经指向已释放内存的指针。野指针在程序运行时可能导致不可预见的行为,甚至引发程序崩溃,因此理解和避免野指针的出现至关重要...

    MFC应用程序中指针的使用

    在MFC(Microsoft Foundation Class)应用程序中,指针的使用是至关重要的,因为它们是对象之间通信的主要手段。MFC库基于面向对象的C++,并提供了构建Windows应用程序的框架,包括视图(View)、框架(Frame)、...

    2小时精通C++智能指针

    教程中从最简单的例子入手,覆盖智能指针的常用技术点,并穿插实例程序。本篇讲解的技术点包括:共享指针、弱指针、唯一指针、自动指针等。本课程中涉及的所有软件和示例源码,均提供免费下载。

    M0 程序指针跳转

    在嵌入式系统开发中,M0程序指针跳转是一项关键操作,特别是在编写Bootloader时。Bootloader是系统启动时运行的第一段代码,负责初始化硬件、加载操作系统映像到内存,并将控制权交给操作系统。对于基于ARM Cortex-...

    ABB机器人手动模式切换自动模式时,程序指针会自动PP移至Main的解决办法.docx

    在从手动模式切换到自动模式的过程中,程序指针会自动定位到主程序的起始位置,这是ABB机器人系统的一种默认设置,旨在确保每次自动运行时都能从一个统一的起点开始。 然而,在实际操作过程中,有时我们需要机器人...

    C语言程序(链表,指针,数组)

    本压缩包中的文件涵盖了C语言的一些核心概念,包括链表、指针和数组等,这些都是C语言中非常关键的数据结构和操作。此外,还有一些特定的程序设计题目,如八皇后问题和逆波兰表达式。 1. **链表**:链表是计算机...

    C程序中的指针_北航软国重专题报告讲义

    尹宝林教授来自北航软件开发环境国家重点实验室,他的专题报告讲义《C程序中的指针》在深入探讨指针机制及其在程序设计中的应用方面,为我们提供了宝贵的见解和丰富的知识。本文将基于讲义内容,深入分析C语言指针的...

    C语言指针操作技巧探讨.pdf

    C语言中的指针是其强大特性的核心之一,它允许程序员直接操作内存,提高了程序的灵活性和效率。然而,不当的指针操作可能导致严重的问题,如野指针,这会威胁到整个程序的稳定性。因此,理解和掌握指针操作技巧至关...

    程序设计-返回指针值的函数.pptx

    理解这个概念对于程序设计非常重要,因为指针是许多高级编程技术的基础,包括动态内存管理、链表、树等数据结构,以及诸如C++的面向对象编程中的指针成员函数等。在程序设计基础中,熟练掌握返回指针值的函数能够...

    程序设计-指针数组.pptx

    程序设计基础是学习计算机编程的基石,而在基础编程中,指针数组是不容忽视的一个概念。指针数组在处理字符串和数据集合方面显示出了极大的灵活性和效率,它不仅节省内存,还能够提升程序性能,是程序员必须熟练掌握...

    C++程序设计语言中数组和指针的探讨

    ### C++程序设计语言中数组和指针的探讨 #### 一、引言 在C++编程语言中,数组和指针是两个重要的基础概念,它们不仅被广泛应用于各种编程场景,也是理解更复杂数据结构(如链表、树、图等)的基础。正确理解和运用...

    谭浩强C程序设计完整ppt和程序(第五版)内附解压密码

    【谭浩强C程序设计】是中国计算机教育领域中极具影响力的一本书,由谭浩强教授编写,该书自出版以来,已经成为许多初学者学习C语言的首选教材。第五版的《谭浩强C程序设计》在原有的基础上进行了更新和完善,以适应...

    C语言中的指针学习 C语言中的指针学习

    在C语言中,指针是理解程序运行机制和优化代码的关键概念之一。通过掌握指针,程序员能够更灵活地操作内存、实现复杂的数据结构,并提高程序的效率。下面,我们将深入探讨C语言中的指针概念及其应用。 ### 基础指针...

    指针 C语言程序.docx

    在本程序中,`struct Student **students`是一个指向指针的指针,用于动态地修改指针的值,即改变指向学生结构体数组的内存地址。 3. 动态内存分配(Dynamic Memory Allocation):`malloc()`和`realloc()`函数用于...

    MFC 中获取各种类指针的方法

    9) 在任何类中获得应用程序类 10) 从文档类取得视图类的指针 (1) 11) 在 App 中获得文档模板指针 12) 从文档模板获得文档类指针 13) 在文档类中获得文档模板指针 14) 从文档类取得视图类的指针 (2) 15) 从一个...

    C++中指针的使用艺术

    错误地使用指针可能会导致不可预知的错误,例如野指针(指向未知地址)、空悬指针(指向的内存已被释放)、内存泄漏(忘记释放已分配的内存)等问题。因此,指针的使用艺术不仅要求程序员要熟练掌握指针的各种操作,...

Global site tag (gtag.js) - Google Analytics