浅谈C语言中指针使用不当的危险性

上传人:二*** 文档编号:75376376 上传时间:2022-04-15 格式:DOC 页数:3 大小:220.79KB
返回 下载 相关 举报
浅谈C语言中指针使用不当的危险性_第1页
第1页 / 共3页
浅谈C语言中指针使用不当的危险性_第2页
第2页 / 共3页
浅谈C语言中指针使用不当的危险性_第3页
第3页 / 共3页
亲,该文档总共3页,全部预览完了,如果喜欢就下载吧!
资源描述
第 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 .北京 :清华大学出版社 , 1994. 美 Steven Armbrust , Ted Forgeron. 舒 志 勇 , 等 译 . DOS/ BIOS 使用 详 解 M . 北 京 : 电 子 工 业 出 版 社 ,1991.124建议3假如需要把一个字符串的内容并入另一个字符串中 , 应当注意把存放结果字符串的字符数组 的空间定义的大一些 , 以避免越界访问 , 造成不 必要的损失.使用 C 语言编程 , 若每次处理的汉字内容不 同 、个数也不同时 , 希望每次处理的汉字从键盘45
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 商业管理 > 营销创新


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!