本篇为原创,禁止任何形式的他用!



一、疑问点

        指针是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”。

最新文章

  1. .NET Core也可以使用MongoDB了
  2. 【工具】 原版完美激活 Flash builder 4.7 【非破解激活】
  3. 20步打造最安全的NGINX WEB服务器
  4. Python学习笔记总结1:字符串表示str与repr的用法比较
  5. git使用记录(新手入门)
  6. .net 下载图片
  7. 谁是Docker的开发人员
  8. solr常用命令
  9. rownum基本用法
  10. 46 Simple Python Exercises (前20道题)
  11. Linux内核分析第六周总结
  12. Jenkins与Gitlab集成
  13. iOS中coreData的用法
  14. Python 爬虫 解决escape问题
  15. RN中关于ListView的使用
  16. 使用WebService与Oracle EBS进行集成
  17. pygame游戏开发-简介
  18. 巧用网页开发者工具F12 审查、修改元素、去除广告、屏蔽遮罩
  19. kendo ui - grid 数据表格系列
  20. vue相关理论知识

热门文章

  1. 创建hexo风格的markdown页面
  2. 【Linux】scp“免密” 远程copy较多文件
  3. VS2008发布项目“发布失败”,没有提示错误
  4. 中资收购美新半导体,为何能通过CFIUS审查(其实是国内公司,技术水平国内领先,和国际仍有差距)
  5. Android零基础入门第77节:Activity任务栈和启动模式
  6. C#try catch块
  7. VC 调用 MinGW 生成的dll good
  8. 瑞芯微RK3399宣布系统开源,进入百余种行业市场!
  9. Bootstrap3.0学习(一)
  10. GetLastError()返回值列表(3259个错误列表)