`
kelehaier
  • 浏览: 5138 次
  • 性别: 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”。
分享到:
评论

相关推荐

    易语言整数型转换到子程序指针

    在易语言编程中,"整数型转换到子程序指针"是一个常见的操作,涉及到程序设计中的类型转换和函数调用机制。易语言是一种以中文为语法的编程语言,旨在降低编程难度,让非计算机专业的人也能进行软件开发。在这个主题...

    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)、...

    C语言程序设计中指针变量的关联引用.pdf

    "C语言程序设计中指针变量的关联引用" 指针变量是C语言程序设计的精髓,也是C语言代码的质量和执行效率的关键。本文详细论述了指针变量的概念、指针变量关联引用、基本类型变量的指针变量关联引用、字符串常量、...

    M0 程序指针跳转

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

    野值剔除的程序

    根据给定的信息,本文将详细解释“野值剔除的程序”所涉及的关键知识点,包括其背景、原理、实现步骤及应用场景。 ### 背景介绍 在数据分析领域,经常遇到异常值(也称为野值)的问题。这些异常值可能是由于测量...

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

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

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

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

    程序设计-结构体指针.pptx

    总结,结构体指针在程序设计中扮演着重要的角色,它们允许我们灵活地处理和操作结构体数据,特别是在大型程序中,通过结构体指针实现的函数参数传递可以显著提高程序的执行效率。熟练掌握结构体指针的使用,对于提升...

    教你如何找到导致程序跑飞的指令

    所谓“程序跑飞”,通常指的是程序执行过程中由于某种原因(如非法内存访问、指针错误等)导致程序状态异常,进而使程序执行流偏离正常路径的现象。这种情况往往会导致系统崩溃或硬件异常中断。本文将详细介绍如何...

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

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

    程序设计-指针数组.pptx

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

    c#嵌入一个外部exe程序到程序窗体

    这个过程通常被称为"嵌入式应用程序"或者"托管应用程序",允许用户在一个主应用程序中直接操作另一个程序,提高了用户体验和软件集成度。下面我们将详细探讨如何实现这一功能。 首先,我们需要理解C#中的Form和...

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

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

    解决keil4版本的程序乱跳的原因

    如果在程序中有中断程序没有正确使用,或者使用了错误的方式处理中断,那么中断服务程序可能会在不恰当的时候被调用,干扰了主程序的执行流程。例如,中断程序可能因为优先级问题、配置错误或者错误地修改了寄存器,...

    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) 从一个...

Global site tag (gtag.js) - Google Analytics