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”。
最新文章
- .NET Core也可以使用MongoDB了
- 【工具】 原版完美激活 Flash builder 4.7 【非破解激活】
- 20步打造最安全的NGINX WEB服务器
- Python学习笔记总结1:字符串表示str与repr的用法比较
- git使用记录(新手入门)
- .net 下载图片
- 谁是Docker的开发人员
- solr常用命令
- rownum基本用法
- 46 Simple Python Exercises (前20道题)
- Linux内核分析第六周总结
- Jenkins与Gitlab集成
- iOS中coreData的用法
- Python 爬虫 解决escape问题
- RN中关于ListView的使用
- 使用WebService与Oracle EBS进行集成
- pygame游戏开发-简介
- 巧用网页开发者工具F12 审查、修改元素、去除广告、屏蔽遮罩
- kendo ui - grid 数据表格系列
- vue相关理论知识
热门文章
- 创建hexo风格的markdown页面
- 【Linux】scp“免密” 远程copy较多文件
- VS2008发布项目“发布失败”,没有提示错误
- 中资收购美新半导体,为何能通过CFIUS审查(其实是国内公司,技术水平国内领先,和国际仍有差距)
- Android零基础入门第77节:Activity任务栈和启动模式
- C#try catch块
- VC 调用 MinGW 生成的dll good
- 瑞芯微RK3399宣布系统开源,进入百余种行业市场!
- Bootstrap3.0学习(一)
- GetLastError()返回值列表(3259个错误列表)