一、疑问点
指针是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应用程序中,CWinApp类代表整个应用程序,CWnd类是所有窗口对象的基类,而CDialog类则用于创建对话框。 创建MFC指针式时钟程序的第一步是建立一个新的MFC AppWizard项目。在Visual C++ 6.0中,选择“File”->...
在C语言中,指针是编程的一个核心概念,它提供了对内存地址的直接访问,使得程序可以高效地处理数据和实现复杂的数据结构。本资源"《C程序开发范例指针篇程序源码》"旨在帮助开发者深入理解和掌握C语言中的指针用法...
C++中的野指针是指那些指向未知或非法内存地址的指针,它们可能是未初始化的,或者是曾经指向已释放内存的指针。野指针在程序运行时可能导致不可预见的行为,甚至引发程序崩溃,因此理解和避免野指针的出现至关重要...
在MFC(Microsoft Foundation Class)应用程序中,指针的使用是至关重要的,因为它们是对象之间通信的主要手段。MFC库基于面向对象的C++,并提供了构建Windows应用程序的框架,包括视图(View)、框架(Frame)、...
C++ 指针 实现迷宫 程序代码 C++ 指针 实现迷宫 程序代码 C++ 指针 实现迷宫 程序代码 C++ 指针 实现迷宫 程序代码
### C语言中的指针程序设计 #### 7.1 指针概述 - **指针与指针变量**: - **定义**:在C语言中,指针是一种特殊的变量,它存储的是另一个变量的地址,而不是具体的值。这个地址被称为指针,而能够存储这种地址的...
在嵌入式系统开发中,M0程序指针跳转是一项关键操作,特别是在编写Bootloader时。Bootloader是系统启动时运行的第一段代码,负责初始化硬件、加载操作系统映像到内存,并将控制权交给操作系统。对于基于ARM Cortex-...
本压缩包中的文件涵盖了C语言的一些核心概念,包括链表、指针和数组等,这些都是C语言中非常关键的数据结构和操作。此外,还有一些特定的程序设计题目,如八皇后问题和逆波兰表达式。 1. **链表**:链表是计算机...
在嵌入式系统开发过程中,由于外部干扰、硬件故障等因素的影响,CPU的程序计数器(PC指针)可能会发生异常跳转,导致程序运行至未预期的位置或者空白区域,从而引发系统的不稳定甚至崩溃。为了有效解决这一问题,...
在Windows操作系统中,开发一款指针时钟程序是一项常见的编程任务,这可以帮助用户直观地查看时间,同时也是一个学习和实践Windows编程技术的好项目。在这个项目中,我们关注的是使用VC++(Visual C++)作为编程语言...
《C程序中的指针》是北航软件开发环境国家重点实验室尹宝林教授的一份专题报告讲义,深入探讨了C语言中的指针及其在程序设计中的应用。C语言因其精炼、灵活且生成代码效率高的特点,被广泛应用于系统程序设计、操作...
C语言中的“指针”是计算机程序设计教学中一个非常关键的概念。指针是C语言的核心特性之一,它允许程序直接对内存进行操作,从而提高程序的执行效率。由于指针的概念相对抽象,对于初学者而言,理解和运用指针成为...
该程序主要利用指针操作来完成任务,因此,下面将从指针的基础知识出发,详细介绍该程序中的核心概念及其实现逻辑。 ### 指针基础知识 在C语言中,指针是一种非常重要的数据类型,它存储的是变量或数据结构的内存...
理解这个概念对于程序设计非常重要,因为指针是许多高级编程技术的基础,包括动态内存管理、链表、树等数据结构,以及诸如C++的面向对象编程中的指针成员函数等。在程序设计基础中,熟练掌握返回指针值的函数能够...
在程序设计中,指针变量是一种重要的数据类型,它允许我们在程序中使用内存地址来存储和操作数据。在本节中,我们将详细介绍指针变量的定义和引用。 指针变量的定义 ---------------- 指针变量是一种特殊的变量,...
这个过程通常被称为"嵌入式应用程序"或者"托管应用程序",允许用户在一个主应用程序中直接操作另一个程序,提高了用户体验和软件集成度。下面我们将详细探讨如何实现这一功能。 首先,我们需要理解C#中的Form和...
### C++程序设计语言中数组和指针的探讨 #### 一、引言 在C++编程语言中,数组和指针是两个重要的基础概念,它们不仅被广泛应用于各种编程场景,也是理解更复杂数据结构(如链表、树、图等)的基础。正确理解和运用...
程序设计\不含指针的选择排序.对初学者有所帮助
在本程序中,`struct Student **students`是一个指向指针的指针,用于动态地修改指针的值,即改变指向学生结构体数组的内存地址。 3. 动态内存分配(Dynamic Memory Allocation):`malloc()`和`realloc()`函数用于...