一、疑问点
指针是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野指针处理 #### 一、野指针的概念 野指针,是指向不可用内存区域的指针。这种指针的操作可能导致程序发生不可预知的错误,例如...通过这些方法,可以有效地避免野指针带来的风险,提高程序的稳定性和安全性。
例如,在Windows环境下,程序中的指针实际上是基于内存段偏移的地址,而非实际的物理地址。这意味着即使多个程序的零值指针都指向相同的“0地址”,实际上每个程序都会在其自己的内存空间内运行。这种设计使得访问空...
通过指针可以实现各种程序设计,例如,交换两个变量的值、查找数组中的最大值或最小值、字符串的处理等。 六、指针的应用 指针的应用非常广泛,例如,在数据结构中,指针可以用来实现链表、树、图等数据结构。在...
通过以上步骤,你可以在MFC应用程序中轻松地获取和使用主窗口的指针。这是一项基础但至关重要的技能,对于理解和控制你的MFC程序的运行流程具有重要意义。在实际编程过程中,理解MFC的类层次结构以及对象间的关联...
C++中的野指针是指那些指向未知或非法内存地址的指针,它们可能是未初始化的,或者是曾经指向已释放内存的指针。野指针在程序运行时可能导致不可预见的行为,甚至引发程序崩溃,因此理解和避免野指针的出现至关重要...
5. **易语言中的实现**:在提供的"易语言取子程序真实指针源码"中,很可能包含了使用易语言的命令和结构来获取子程序地址的示例代码。例如,它可能包含解析PE文件头、遍历导入表或者使用`系统.内存`命令进行内存读取...
经典的指针程序,交换两个数字,有兴趣的可以看下
### C语言中的指针程序设计 #### 7.1 指针概述 - **指针与指针变量**: - **定义**:在C语言中,指针是一种特殊的变量,它存储的是另一个变量的地址,而不是具体的值。这个地址被称为指针,而能够存储这种地址的...
### MFC应用程序中指针的使用 MFC(Microsoft Foundation Classes)是微软为简化Windows编程而提供的一套类库,广泛应用于Windows平台下的GUI应用程序开发。对于初学者来说,理解和掌握MFC中的指针是非常重要的一步...
在C语言程序设计中,指针作为地址的抽象,被赋予了极其灵活的使用方式,这使得指针成为了一种高级的编程技巧。尽管如此,它也为编程带来了诸多优点,比如可以编写出高效、紧凑和简洁的代码。指针的存在,使得C语言在...
"C语言程序设计中指针变量的关联引用" 指针变量是C语言程序设计的精髓,也是C语言代码的质量和执行效率的关键。本文详细论述了指针变量的概念、指针变量关联引用、基本类型变量的指针变量关联引用、字符串常量、...
程序中定义了一个整型数组`a[5]`,然后使用指针`p`遍历数组,通过`*(p+i)`设置和打印数组元素的值。 总之,C语言中的指针与数组的关系是相辅相成的。指针能够灵活地处理数组,提供了对内存中数据的强大访问能力。...
本文主要讲解了程序设计中多维数组的概念和实现,包括多维数组的定义、元素的地址计算、指针变量的使用等方面的内容。 在程序设计中,多维数组是一种常用的数据结构,用于存储和处理大量的数据。多维数组可以看作是...
在C++编程中,指针是一个非常重要的概念,它提供了对内存地址的直接访问,使得我们能够高效地操作数据和实现复杂的数据结构。结构体(struct)是C++中的一个复合数据类型,允许我们将多个不同类型的变量组合成一个...
C语言中的指针是程序设计的一大特色,它允许直接操作内存地址。`c-chap7 指针.ppt`将深入讲解指针的概念,包括指针变量的声明、赋值、解引用,以及指针与数组、函数和字符串的交互。 4. **数组**: 数组是相同...
在32位程序中,内存地址一般为32位长度,指针所指向的内存区域是以指针值所代表的内存地址开始,长度为sizeof指针所指向类型的一片内存区域。 指针的灵活性体现在它能够以非常高效的方式解决问题,但同时也带来了...
C语言中的指针是其强大特性的核心之一,它允许程序员直接操作内存,提高了程序的灵活性和效率。然而,不当的指针操作可能导致严重的问题,如野指针,这会威胁到整个程序的稳定性。因此,理解和掌握指针操作技巧至关...
程序设计基础中,指针数组是一个重要的概念。指针数组是一个数组,其中每一个元素都是指针类型的数据,即每一个元素都存放一个地址,相当于一个指针变量。这种数据结构非常有用,特别是在字符串处理中,可以提高字符...
这个过程通常被称为"嵌入式应用程序"或者"托管应用程序",允许用户在一个主应用程序中直接操作另一个程序,提高了用户体验和软件集成度。下面我们将详细探讨如何实现这一功能。 首先,我们需要理解C#中的Form和...