處有未經處理的異常:0xC0000005 : 讀取位置 0x00000000 時發生訪問衝突。

首先排除一種小概率事件就是系統衝突導致的,比如系統盤目錄存在類似的第三方庫文件,程序運行將崩潰,並報錯0xC0000005 : 讀取位置 0x00000000 時發生訪問衝突。

上面的意思就是你吧值付給了不該賦給的變量,或者說你把值付給了不能付給的變量(或者常量)

(1)最簡單也最直接的錯誤可能就是scanf()的問題,我們都知道輸入的時候都是scanf("%格式",&變量),那麼除了字符串(可要&,可不要)之外,所有的輸入都需要&,如果你丟了,在很多編譯器上變異的時候是查不出來的,也就是說是沒有錯的,但是輸入數據會差生上述錯誤,是因爲寫成scanf("%格式",變量)這種形式了,這樣你所輸入的變量就不知道會存儲到哪裏。

(2)空指針賦值的問題。

我們知道如果某一個指針是空的是不能直接給他賦值的原因是空指針不知道指得什麼東西,那麼他沒有固定的內存,現在你給他賦值,通俗點理解就是他不知道該怎麼存,也不知道存在哪,也不會儲存,但是現在你有需要讓他存儲,那麼就會出現上述的問題,這時候解決辦法就是重新申請空間(用malloc或者new),或者是你儘量避免他成爲空指針,或者是當他有成爲空指針的可能性時,你就單獨討論。

下面幾個例子就是有可能的:

下面的語句會出這個問題
int * p = 0;
p[0] = 100;
當然,實際代碼中不可能這麼明顯,這只是一個例子,可能相似,這得你自己好好看看,上面的0實際上和NULL是一樣的,這就是空指針賦了值。

下面這種寫法也會產生問題
a=(double*)malloc(sizeof(double)*6);
h=…
a[0]=h;

首先你不知道malloc是否會成功 如果失敗的話 返回的恰好是NULL 一般情況下 你分配這麼點內存 是不會失敗的 但是正如你說的 幾個循環過後 你可能沒free 內存耗盡 或者產生碎片 malloc失敗了 你又沒判斷 那麼恰好問題就是給空指針賦值產生異常

下面的三種指針情況是網上的:大家可以根據自己的情況和他的對照着看看:

可能性 3 種
1:
char *p;
p = new char[number];
delete [] p;

// always using p…
p = xxx; // access violation

2:
char *p;
memcpy(p, xxx, number); // access violation

3:
char *p;
p = new char[number];
delete [] p;

delete [] p; // access violation

0xC0000005: Access Violation錯誤調試- -

補充一句話:(1)編譯時沒有問題
(2)運行時是一個循環計算,設置斷點,前幾個循環都沒有問題,到其中某一個循環(循環結束條件還沒有達到)會 出現上述問題。

這時候肯定就是你在哪一步中間將空指針賦了值。

(3)數組或者指針越界

只要是和內存相關的基本都是有可能的,當然數組或是指針越界,這個也是很常見的,這個就不舉例子了,相信大家都能理解什麼意識,也知道怎麼解決,這個就需要大家比較小心和仔細了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章