为何出现“非法操作
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
为何出现“非法操作”徐淼华中国科学技术大学少年班9700(230026)在使用电脑
的过程中,尤其是编程的时候,经常会遇到windows弹出如图所示的对话框,提示软件进行
了非法操作:图:点击了“详细资料”
后的对话框此时如果点击“详细资料”,对话框扩大窗口,给出了寄存器的值,但是一般人
看不明白;而如果点击“调试”,它将调用visual c++或delphi之类的安装在系统中的编译
器,并在编译器中显示程序的汇编码,更是让人头大一圈;若点击“关闭”,则会将内存中的
相关数据都丢弃(很多时候这些数据是有用的),非常可惜。
引起windows弹出此对话框的原
因是内存出错。
内存质量不好,不稳定,某些数据无端的改变,当然被认为是“非法操作”。
这里讨论的是软件特别是自己编写的小程序是如何引起错误的。
windows 9x中,不必关心内
存模式、地址转换、64k的代码段和数据段,因为地址和内存都放在线形的32位内存空间中。
每个应用程序都可“看见”4gb的线形地址空间,其中最开始的4mb由操作系统保留,剩下
的不足2gb的空间属于应用程序私有空间。
要强调的是,在4mb 到2gb之间的非保留空间是
完全私有的。
每个进程都可有自己私有的地址空间,而且与其他进程的地址空间是完全无关
的。
利用处理器的页映射能力,操作系统可为每个进程提供独立的从逻辑地址到物理内存(ram
或分页文件)的映射,使一个进程的地址空间对另一个进程完全不可见。
编程时,若一个进
程(程序)访问了它的地址空间外的地址,windows 9x就会弹出上述对话框。
具体有以下几
个原因:1.数组下标越界观察以下程序:#include<stdio.h>void main(){ int a[5]; a[5]=0;}大家知道,c语言不检查数组下标越界,该程序编译可通过。
执行时引发上述错误,这是因为语句int a[5]只定义了a[0]至a[4],a[5]访问的地址不属
于程序的地址空间。
要特别注意数组下标,除了上述原因外,它的错误还往往伴随着逻辑错
误(符合语法但得不到正确的结果)。
2.未初始化的指针观察以下程序:void
main(){int *a;*a=0;}语句int *a定义了一个指针,a中存放的只是一个地址,
它是一个随机数,极可能指向其它进程的地址空间。
对该地址进行读写操作,也极可能引发
上述错误。
修改的办法是再定义一个整型变量,并将它的地址赋给指针变量a。
纯dos操作
系统允许程序对它本身以外的地址进行操作。
我在dos下编程时,曾因忘了初始化指针,而
将整个编译器搞得面目全非。
3.栈溢出这是最不易察觉的一点。