天天被操天天被操综合网,亚洲黄色一区二区三区性色,国产成人精品日本亚洲11,欧美zozo另类特级,www.黄片视频在线播放,啪啪网站永久免费看,特别一级a免费大片视频网站

現(xiàn)在位置:范文先生網(wǎng)>理工論文>計(jì)算機(jī)信息技術(shù)>為何出現(xiàn)“非法操作

為何出現(xiàn)“非法操作

時(shí)間:2023-02-21 00:09:24 計(jì)算機(jī)信息技術(shù) 我要投稿
  • 相關(guān)推薦

為何出現(xiàn)“非法操作

為何出現(xiàn)“非法操作”

徐淼華

中國科學(xué)技術(shù)大學(xué)少年班9700230026

 

   在使用電腦的過程中,尤其是編程的時(shí)候,經(jīng)常會(huì)遇到Windows彈出如圖所示的對話框,提示軟件進(jìn)行了非法操作:


                        圖:點(diǎn)擊了“詳細(xì)資料”后的對話框

 

此時(shí)如果點(diǎn)擊“詳細(xì)資料”,對話框擴(kuò)大窗口,給出了寄存器的值,但是一般人看不明白;而如果點(diǎn)擊“調(diào)試”,它將調(diào)用Visual C++Delphi之類的安裝在系統(tǒng)中的編譯器,并在編譯器中顯示程序的匯編碼,更是讓人頭大一圈;若點(diǎn)擊“關(guān)閉”,則會(huì)將內(nèi)存中的相關(guān)數(shù)據(jù)都丟棄(很多時(shí)候這些數(shù)據(jù)是有用的),非?上А

引起Windows彈出此對話框的原因是內(nèi)存出錯(cuò)。內(nèi)存質(zhì)量不好,不穩(wěn)定,某些數(shù)據(jù)無端的改變,當(dāng)然被認(rèn)為是“非法操作”。這里討論的是軟件特別是自己編寫的小程序是如何引起錯(cuò)誤的。Windows 9X中,不必關(guān)心內(nèi)存模式、地址轉(zhuǎn)換、64K的代碼段和數(shù)據(jù)段,因?yàn)榈刂泛蛢?nèi)存都放在線形的

32位內(nèi)存空間中。每個(gè)應(yīng)用程序都可“看見”4GB的線形地址空間,其中最開始的4MB由操作系統(tǒng)保留,剩下的不足2GB的空間屬于應(yīng)用程序私有空間。要強(qiáng)調(diào)的是,在4MB 2GB之間的非保留空間是完全私有的。每個(gè)進(jìn)程都可有自己私有的地址空間,而且與其他進(jìn)程的地址空間是完全無關(guān)的。利用處理器的頁映射能力,操作系統(tǒng)可為每個(gè)進(jìn)程提供獨(dú)立的從邏輯地址到物理內(nèi)存(RAM或分頁文件)的映射,使一個(gè)進(jìn)程的地址空間對另一個(gè)進(jìn)程完全不可見。編程時(shí),若一個(gè)進(jìn)程(程序)訪問了它的地址空間外的地址,Windows 9X就會(huì)彈出上述對話框。具體有以下幾個(gè)原因:

1.?dāng)?shù)組下標(biāo)越界

觀察以下程序:

#include<stdio.h>

void main()

{

    int a[5];

    a[5]=0;

}

大家知道,C語言不檢查數(shù)組下標(biāo)越界,該程序編譯可通過。執(zhí)行時(shí)引發(fā)上述錯(cuò)誤,這是因?yàn)檎Z句int a[5]只定義了a[0]a[4],a[5]訪問的地址不屬于程序的地址空間。要特別注意數(shù)組下標(biāo),除了上述原因外,它的錯(cuò)誤還往往伴隨著邏輯錯(cuò)誤(符合語法但得不到正確的結(jié)果)。

 

2.未初始化的指針

觀察以下程序:

void main()

{

int *a;

*a=0;

}

語句int *a

定義了一個(gè)指針,a中存放的只是一個(gè)地址,它是一個(gè)隨機(jī)數(shù),極可能指向其它進(jìn)程的地址空間。對該地址進(jìn)行讀寫操作,也極可能引發(fā)上述錯(cuò)誤。修改的辦法是再定義一個(gè)整型變量,并將它的地址賦給指針變量a。純DOS操作系統(tǒng)允許程序?qū)λ旧硪酝獾牡刂愤M(jìn)行操作。我在DOS下編程時(shí),曾因忘了初始化指針,而將整個(gè)編譯器搞得面目全非。

3.棧溢出

這是最不易察覺的一點(diǎn)。我是在編寫一個(gè)圖象處理軟件時(shí)遇到的,當(dāng)時(shí)真是百思不得其解:

#include<stdio.h>

void func()

{

    int  a[300000];

    printf("Now Call Functions");

}

void main()

{

    func();

}

程序運(yùn)行時(shí),系統(tǒng)在棧中為局部變量開辟空間。局部變量有很多好處,但是必須保證棧的空間足夠。該程序定義了長為300000的整數(shù)數(shù)組局部變量,它超出了棧的大小。通過修改數(shù)組的長度,看是否會(huì)出現(xiàn)“非法操作”,得知我所用的系統(tǒng)(Windows NT4)在缺省條件下,棧的大小在200000300000之間。另外,使用遞歸不當(dāng),也會(huì)引起棧的溢出。解決的辦法一般并非將局部變量該為全局變量(盡管實(shí)際用到的內(nèi)存再大,Windows也能支持,但從效率來說一般不這樣做),而是使用動(dòng)態(tài)分配內(nèi)存技術(shù),從“堆”中分配內(nèi)存。將語句int  a[300000] 改為 int  a=new int[300000],然后仍然a看成長為300000的數(shù)組使用。

 

最后提醒大家,編寫程序后,編譯運(yùn)行前存盤,做到“有備無患”。

 

                                            中國科學(xué)技術(shù)大學(xué)(230026

                                              徐淼華 vince_xu@263.net

                                                   2000,3,16     


【為何出現(xiàn)“非法操作】相關(guān)文章:

為何微笑,為何流淚08-16

防止出現(xiàn)“真空”08-17

出現(xiàn)優(yōu)秀作文08-31

期權(quán)在中國為何緩行08-05

監(jiān)管為何效率低?08-05

產(chǎn)權(quán)為何重要08-07

產(chǎn)權(quán)為何重要08-12

市長為何要辭官08-17

他們?yōu)楹握b讀困難08-17