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程序中可怕的野指针的更多相关文章
- C程序疑问解答 ——可怕的野指针
本篇为原创,禁止任何形式的他用! 一.疑问点 指针是C语言一个很强大的功能,同时也是很容易让人犯错的一个功能,用错了指针,轻者只是报个错,重者可能整个系统都崩溃了.下面是大家在编写C程 ...
- QT信号槽 中的对象野指针
例: connect(&objec1,&class::slot_func1,&object2,&class::slot_func2) 如果 &objec 传 ...
- 在嵌入式程序中QT去掉鼠标指针
在像arm的QT编程当中,一般都是使用触摸来操作,当是我们运行程序的时候会发现总是有个鼠标箭头在那里,下面介绍种方法将其给去掉.这样就漂亮多了.在main()函数加入 #include <QWS ...
- NULL指针、零指针、野指针
1.1.空指针 如果 p 是一个指针变量,则 p = 0; p = 0L; p = '\0'; p = 3 - 3; p = 0 * 17;p=(void*)0; 中的任何一种赋值操作之后, p 都成 ...
- C语言进阶之路(三)----野指针的产生原因及解决办法
1.会产生野指针的做法 #include <stdio.h> //这就是一种错误的写法 int main(){ int *p = NULL; p = (); //释放P所指向的内存空间,但 ...
- 黑马程序员-nil Nil NULL NSNull 野指针和空指针
空指针1.空指针指不含有任何内存地址的指针.在没有具体初始化之前,其被符值为0Dog * dog = nil;Dog * dog = NULL;都为空指针2.野指针指指向的内存为垃圾内存,导致其值不确 ...
- OC中的野指针(僵尸指针)
涉及到内存管理问题的都是类类型的变量,而在OC中我们操纵这些对象都是通过操纵指向他们的指针来完成的,一致很多时候会忽略指针存在.比如定义UIView * view = [[UIView alloc]i ...
- OC中的野指针,空指针,nil,Nil,NULL,NSNULL小结
周末与一个老朋友吃饭聊天,因为他正在培训班学习iOS开发,就随便聊了几句,发现自己OC基础上的欠缺和一些知识点的混淆.特此整理如下. 1.空指针 没有存储任何内存地址的指针就称为空指针(NULL指针) ...
- C/C++中内存泄漏、内存溢出与野指针的解释与说明
1.内存泄漏 内存泄漏是指我们在堆中申请(new/malloc)了一块内存,但是没有去手动的释放(delete/free)内存,导致指针已经消失,而指针指向的东西还在,已经不能控制这块内存, 所以就是 ...
随机推荐
- layui弹出框打开第二次select内容无法显示问题
今天, 在使用layui弹出框的时候, 第一次进入select内容加载是正常的, 将弹出框关闭再次进入后select下拉框内容为空, 经排查是因为每次弹出窗口z-index都会改变, 弹出框的z-in ...
- 零元学Expression Blend 4 – Chapter 43 如何指定Childwindow PopUp位置
原文:零元学Expression Blend 4 – Chapter 43 如何指定Childwindow PopUp位置 有网友询问我有关Childwindow是否能指定弹出位置? 其实只要透过小小 ...
- shell中select、case的使用
case和select结构在技术上说并不是循环, 因为它们并不对可执行代码块进行迭代. 但是和循环相似的是, 它们也依靠在代码块顶部或底部的条件判断来决定程序的分支. select select结 ...
- RedHat 7.3 修改ASM磁盘绑定路径
RedHat 7中,很多命令发生了改变,绑定磁盘不再是start_udev,而是udevadm,具体绑定方式,请看另一篇博文: http://www.cnblogs.com/zx3212/p/6757 ...
- Delphi7 时钟(使用了多个自定义组件)
http://download.csdn.net/detail/akof1314/3073289
- window8 飘带与页面切换效果
演示效果如下 用鼠标点击滑动试试就能看到效果了 ^_^ iscroll 不仅可以做到自然滚动条的效果,看官方文档还可以用来做页面切换的效果,很好很强大. 所以我结合流行的飘带元素做了个简单的例子.. ...
- 反汇编分析__stdcall和__cdecl的异同
C++代码如下:.h头文件 #pragma once#ifdef DLLTestAPI#else#define DLLTestAPI _declspec(dllimport)#endifint DLL ...
- 利用POi3.8导出excel产生大量xml临时文件怎么办?
在实际项目中,经常会用到POI3.8来导出excel.而导出excel的时候,会因为残留大量以.xml结尾的文件而导致服务器存储空间急剧增长,最后导致系统挂了.为此,该怎么办呢? .xml后缀残留文件 ...
- 使用pjax实现类似github无刷新更改页面url
pjax=pushState+ajax,相信用过github的同学都知道,github部分页面采用了pjax这个项目来实现ajax无刷新加载的同时改变页面url.一起来学习一下这个插件吧. 我们都知道 ...
- spring源码解析之IOC容器(三)——依赖注入
上一篇主要是跟踪了IOC容器对bean标签进行解析之后存入Map中的过程,这些bean只是以BeanDefinition为载体单纯的存储起来了,并没有转换成一个个的对象,今天继续进行跟踪,看一看IOC ...