


全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第 19 卷Vol . 19第 2 期No . 2洛阳师专学报Journal of Luoyang Teachers College2000 年 4 月Apr. 2000浅谈C 语言中指针使用不当的危险性康牧 , 赵治国(洛阳师专 , 河南洛阳 471022)摘要 : C 语言是一种中级语言 , 它的指针具有强大的功能 , 它的功能是其它高级语言所不能比拟的 , 但是 , 如果对指针使用不当就会使系统处于极端危险的状态 , 有时会使系统丢失数据 , 有时会使系统死机1 本文详细讨论了产生这种情况的原因 , 同时也给出了正确的使 用方法.关键词 : C 语言 ; 指针 ; 悬挂访问 ; 中断向量表 ; 堆栈段 ; 代码段 ; 数据段 ; 附加段中图分类号 : TP312文献标识码 : A文章编号 :1007 - 2969 (2000) 02 - 0080 - 03The Da nger s fo r Imp rop er U se of Pointer in C L a ngua geKANG MuZHAO ZHi2guo(Luoyang Teachers College , Luoyang 471022 ,China)Abstract : C language is a kind of intermediate language . Its pointer has so powerful a function that even some ad2 vanced languages do not have . However , if the pointer is not used properly , the system could be in great danger . Sometimes even data missing and a dead halt may happen to the system. In this article , a detailed analysis is made of the reasons why such problems occur and a direction of how to use it is provided.Key words : C language ; pointer ; hanging use ; table of interrupt address ; stack segment ; code segment ; data seg2ment ; extra segment却会将错就错地执行下去. 所以在使用 C 语言编程 , 特别是使用指针时要特别小心 , 否则 , 可 能会得到一个莫名其妙的结果 , 有时甚至会出 现系统死机, 不能正常结束的现象.下面我们举两个用 C 语言编写的程序 , 说明 在 C 语言中 , 使用指针不当而得到莫名其妙的结果和出现程序不能正常结束的现象 1 然后再分 析产生这种情况的原因 , 及应注意的事项.0引言C 语言 中 的 指 针 , 简 单 地 说 就 是 一 个 地 址.我们定义一个整型指针变量 , 那么就可以让它指 向一个整型数据变量 , 或者说把一个整型数据变 量的地址赋给这个指针变量. 同理可以定义实型指针 , 字符型指针 , 结构体指针 , 数组指针 , 函 数指针等.C 语言 的 指 针 为 我 们 提 供 了 极 其 强 大 的 功 能 . 但是 , 由于 C 语言对程序格式要求特别宽 , 不象 PASCAL 等语言那样要求严格 , 这就不可避免地带来了问题. 例如 : PASCAL 语言中对数组做 越界检查 , 也就是当数组的下标超过数组下标的 定义范围时 , 系统就会给出错误信息 , 而不再往 下执行 ; 而 C 语言中的数组却不做越界检查 , 而 是接着访问相邻的地址中的信息. 也就是说 , 在C 语言中 , 即使使用不当 , 也不给出错误信息 ,1程序 1假设我们编一个程序 , 定义两个大小都是 10 的整型数组 a 和 b. 数组 a 先定义 , 数组 b 后定 义 . 在数组 b 中先放入前 10 个裴波纳齐数 , 再用 一个整型指针 p 指向数组 a , 通过指针给数组 a 中放入 15 个数 , 它们分别是从 - 1 到 - 15 , 然后 再分别输出数组 a 和数组 b 的内容.程序如下 :# include stdio . hmain ()int 3 p ;int a 10 , b 10 , i ;b 0 = 0 ;b 1 = 1 ;for (i = 2 ;i 10 ;i + + )b i = b i - 1 + b i - 2 ;p = a ;for (i = 1 ;i = 15 ;i + + )3 p = - i ;p + + ;printf (”数组 a 的内容为 : for (i = 0 ;i 10 ;i + + )printf (p = %p , q = %p, p , q) ;for (i = 1 ;i = 200 ;i + + )3 q - - = 3 p - - = i ;printf (数据输入完毕 ! n) ;printf (good bye ! n) ;这个程序运行时 , 最后的两行提示信息 输出 , 且不能正常结束 , 必须强行中断 .3 原因分析3 . 1程序 1 的错误原因程序 1 出现错误原因是数组 a 和数组 b 义的时候是紧紧相邻的 , 那么它们在物理地 也是相邻的 . 在往数组 b 中存放了裴波纳齐 的前 10 个数以后 , 在通过指针 p 给数组 a 存 时 , 超出了数组 a 的范围 , 而非法地进入了 b 的区域内 , 修改了数组 b 的内容 , 所以才 现上面那种情况. 而非法地修改其它存储区 数据是相当危险的 , 它将会使系统丢失重要 据 . 所以在使用指针访问数组时一定要注意 下标的范围是从 0 开始 , 千万不要因为粗心 不必要的损失 .3 . 2程序 2 的错误原因程序 2 出现错误的原因是当我们定义一 针变量时 , 除了最后定义的那个指针变量所 的存储单元的地址一定是十六进制的 00B5(通过实验所知) , 前面定义的指针变量所指n) ;printf (%d t,a iprintf ( n) ;printf (数组 b 的内容为 : for (i = 0 ;i 10 ;i + + ) ;n) ;printf (%d t,b i) ;程序执行的结果如下 :数组 a 的内容为 :- 1 - 2 - 3 - 4 - 510数组 b 的内容为 :- 11 - 12 - 13 - 142133- 6- 7- 8- 9 -存储单元的地址一般是随机的 , 没有什么规操作系统在定义指针变量时 , 总是尽可能给配一个空闲区域的地址 , 或者给它一个系统 未用区域的地址. 当你给随机单元中存放较信息的时候 , 影响其它信息的可能性不太大 当你给随机单元中存放的信息较多或者当时 中内存的空闲区域较少的时候 , 影响其它信 可能性就很大了.- 155813而不是我们所期望的内容 :0112358132133程序 2假设我们编一个程序 , 在程序内定义两个整针 , 然后直接输出两个指针所指向单元的地, 再直接向两指针各自所指的地址单元相邻 片连续存储区中存放若干个整数 , 最后输出提示信息 , 程序结束.程序如下 :# include stdio . hmain ()int 3 p , 3 q ;int i ;这种现象的危险性与程序 1 的危险性相就显得更大了 . 它属于在文 1 中提到的悬问问题 . 当一个指针变量没有指向一个具 地址时 , 它的地址用户及操作系统是很难准 道的 , 而这个地址是操作系统随机给予的 , 这个地址不是通过合法的方法得到的 , 操作 并不对这个地址进行合法存取保护 , 这个地 可能在以后地址分配的时候分配给其它变量通过这种手段访问 , 就是悬挂访问. 而这 机地址有时可能会指向文 4 中所说的数据洛阳师专学报2000 年82 者附加段 , 而这种情况可能造成有用信息的修改 . 这对于一个大型的信息管理系统来说是相当 危险的 ; 这 个 随 机 的 地 址 , 有 时 可 能 会 指 向 文5 中所说的中断向量表 , 而中断向量表中存放 的是各个中断服务程序的入口地址 , 如果把它们 的内容修改了 , 则可能会引起中断调用不能正常进行 , 而中断调用在系统的运行过程中是经常发 生的. 例如 , 要访问某一台外设 , 就需要调用中 断 , 而它的中断服务程序的入口地址就保存在中 断向量表中 , 而此时中断向量表中的内容已经改 变了 , 那么 , 该外设就不能被访问了 . 有时这个随机地址可能会指向文 4 中所说的堆栈段 , 而 堆栈段中所存放的信息 , 一般是子程序调用时的 参数 , 也存放子程序调用返回时的断点地址 , 在 子程序返回时需要从堆栈中取出它的断点地址 , 而此时堆栈中的内容已经改变了 , 那么子程序就不能正常返回 , 而使系统无法正常运行. 有时这 个随机地址可能会指向文 4 中所说的代码段 , 如果在程序的运行过程中 , 代码段中的内容被改 变了 , 那么就会使程序在运行的时候出问题 .上输入 , 这就需要在程序中定义一个空间足够大的字符数组 , 用来存放每次输入的汉字字符串. 对于这种问题我们最好不要偷懒省事 , 宁可定义 一个大的字符数组 , 而浪费一些空间 , 也不要犯 上述错误. 也可以定义一个字符型指针 , 事先不 让它指向一个具体的地址 , 在从键盘上输入汉字 之前 , 先输入要输入汉字的个数 , 然后以这个数 值乘以 2 所得到的值 , 作为调用 malloc ( ) 函数或 calloc () 函数的参数 , 申请一个这样大小的空间 , 让定义的那个字符指针指向这个存储空间的首地 址 , 就可以不浪费任何存储空间.尽管 C 语言中的指针使用起来有这么大的 危险 , 但 C 语言的指针为我们所提供的优点是远 远大于它的缺点的 , 在使用 C 语言的指针的时候 只要注意上面提到的问题即可扬其长而避其短.本文所举例子均在 Turbo C 2 . 0 下调试通过.参考文献严蔚敏 , 吴伟民. 数据结构 M . 北京 : 清华大学出版社 , 1997.谭浩强 , 等 . C 语言程序设计教程 M . 北京 :高等教 育出版社 , 1994.王爱民 . 实用 C 语言程序设计教程 M . 成都 : 成都 科技大学出版社 , 1995.沈美明 , 温冬婵. IBM - PC 汇编语言程序设计 M .北京 :清华大学出版社
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030中国牛奶矿物质市场销售渠道与投资盈利性规模报告
- 2025-2030中国液化气钢瓶检修行业市场运营模式及未来发展动向预测报告
- 教育科技企业可持续发展与2025年产品迭代社会责任报告
- 教育科技企业2025年产品迭代策略与教育行业生态构建报告
- 购房解压补充协议6篇
- 干部能力测试试题及答案
- 房地产买卖合同范本(含税费及交付标准)
- 旅游民宿租赁权转让及装修改造及家具转让合同
- 离婚协议签订后子女抚养费支付及变更合同
- 消防设施维护保养管理制度(5篇)
- 2025-2026学年人教版(2024)小学美术二年级上册(全册)教学设计(附目录P144)
- 智慧校园建设“十五五”发展规划
- 流管专员笔试题目及答案
- DBJ15 31-2016建筑地基基础设计规范(广东省标准)
- 第2课《树立科学的世界观》第2框《用科学世界观指导人生发展》-【中职专用】《哲学与人生》同步课堂课件
- 《照明线路安装与检修》一体化课件-第一章 职业感知与安全用电
- GB/T 28121-2011非热封型茶叶滤纸
- 低压电气基础知识培训课件
- 2023年廊坊市投资控股集团有限公司招聘笔试模拟试题及答案解析
- 苹果栽培学完整版课件
- 沁园春长沙完美版课件
评论
0/150
提交评论