现在位置:范文先生网>理工论文>计算机信息技术>为何出现“非法操作

为何出现“非法操作

时间:2023-02-21 00:09:24 计算机信息技术 我要投稿
  • 相关推荐

为何出现“非法操作

为何出现“非法操作”

徐淼华

中国科学技术大学少年班9700230026

 

   在使用电脑的过程中,尤其是编程的时候,经常会遇到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.栈溢出

这是最不易察觉的一点。我是在编写一个图象处理软件时遇到的,当时真是百思不得其解:

#include<stdio.h>

void func()

{

    int  a[300000];

    printf("Now Call Functions");

}

void main()

{

    func();

}

程序运行时,系统在栈中为局部变量开辟空间。局部变量有很多好处,但是必须保证栈的空间足够。该程序定义了长为300000的整数数组局部变量,它超出了栈的大小。通过修改数组的长度,看是否会出现“非法操作”,得知我所用的系统(Windows NT4)在缺省条件下,栈的大小在200000300000之间。另外,使用递归不当,也会引起栈的溢出。解决的办法一般并非将局部变量该为全局变量(尽管实际用到的内存再大,Windows也能支持,但从效率来说一般不这样做),而是使用动态分配内存技术,从“堆”中分配内存。将语句int  a[300000] 改为 int  a=new int[300000],然后仍然a看成长为300000的数组使用。

 

最后提醒大家,编写程序后,编译运行前存盘,做到“有备无患”。

 

                                            中国科学技术大学(230026

                                              徐淼华 vince_xu@263.net

                                                   2000,3,16     


【为何出现“非法操作】相关文章:

为何微笑,为何流泪08-16

防止出现“真空”08-17

出现优秀作文08-31

期权在中国为何缓行08-05

监管为何效率低?08-05

产权为何重要08-07

产权为何重要08-12

市长为何要辞官08-17

他们为何诵读困难08-17