C 讀取訪問許可權衝突引發異常問題

2021-10-10 19:32:57 字數 2208 閱讀 6097

用c++寫**時經常會遇到「引發了異常: 讀取訪問許可權衝突。」這樣的錯誤提示,這種情況產生原因主要有兩點:

一、訪問陣列越界

當採用線性表的順序結構,例如順序表、佇列、棧等,用陣列儲存資料時,若將要讀取資料的位置超出了當前陣列的長度,就會發生陣列訪問越界的狀況。

可這並不會造成編譯錯誤,也就是說,編譯器並不會在你編譯的時候就指出你訪問陣列越界了,這個時候可能還是「0 errors,0 warnings」

你還在暗暗慶幸自己的**沒有bug,但是當你執行之後就會丟擲訪問許可權衝突的異常。

例如:下面這段對佇列和棧的操作

struct stack              //這裡定義了乙個棧的結構

;

struct queue              //這裡定義了乙個佇列的結構

;

while

(queuea-

>front < queuea-

>rear || queueb-

>front < queueb-

>rear)

//instack函式實現出隊後進棧操作

//outstack函式實現出棧**隊操作,入隊後隊尾指標後移

編譯成功沒有報錯,但是執行後丟擲了讀取訪問許可權衝突的異常

我們檢視此時區域性變數的狀態可以發現,佇列a 的隊頭指標和隊尾指標都指向了異常的下標

這顯然發生了訪問越界的情況,因為長度為2000的陣列,下標的取值應該是0~1999。

後來,發現錯誤出在while迴圈判定的條件。本意上是當a、b之間任意乙個佇列中的元素為空的時候就跳出迴圈,但是錯將判定條件中的邏輯且寫成了邏輯或,導致遲遲不能跳出迴圈,最終佇列a的隊頭指標和隊尾指標在不斷的迴圈操作中超出了陣列邊界,發生了讀取訪問許可權衝突的異常。

將while的判定條件修改後,程式可正常執行。

所以遇到讀取訪問許可權衝突的提示,如果異常發生在讀取陣列中資料的時候,可以優先考慮是否是因為某種操作不當導致訪問陣列越界了。

二、空指標異常

這主要發生在通過指標讀取資料時,比如在使用鍊錶的過程中。

示例:鍊錶中的操作

struct node              //這裡定義了乙個結點

;

linklistinvert::

linklistinvert

(int arg,

int n)

r->next =

nullptr

;}

**編譯無錯誤,執行後發生讀取訪問許可權異常

這裡不難看出是因為沒有初始化first指標,使得first指標成為了乙個空指標,指向了乙個不確定的值,隨後進行的操作

node* r = first;
使r指標也成為了乙個空指標,在進行接下來的操作時就丟擲了讀取許可權衝突的異常。

linklistinvert::

linklistinvert

(int arg,

int n)

r->next =

nullptr

;}

而修改的方式也很簡單,對first指標進行初始化後即可執行成功。

類似的,由指標未初始化而引發的讀取訪問許可權異常,還會給出諸如 0xcccccccc、0xcdcdcdcd的異常提示。

當然,不止鍊錶,空指標異常還會出現在很多其他情況下,比如在資料庫查詢,指標未初始化時也會產生空指標異常。

第一次寫部落格,有什麼不對的地方還請指正,謝謝。。。

引發了異常 讀取訪問許可權衝突。 p 是 0x1

1.有下列單鏈表結構 typedef struct node node,link link 為指標型結構體型別 在鍊錶型別的函式中要訪問臨時指標p時無法訪問p next,p data,要注意傳入的p指標是不是空指標沒有被賦值的 node move node p,int i return p 在構造迴...

異常 寫入訪問許可權衝突

前言 這次朋友寫 時遇到解決不了的問題。讓我幫忙看看。我覺得這個問題還挺好的,所以寫下來記錄一下,也算是給自己做乙個筆記。異常其中引發第乙個問題的大部分情況可能是陣列越界。遇到這個問題首先可以檢視自己的 是否有陣列下標越界的情況出現。出問題的 int main if parentheses s,a,...

讀取訪問許可權衝突。0xCDCDCDCD

嘗試寫鍊錶時,在尾節點插入元素的函報錯 tmp是0xcdcdcdcd。listnode insert listnode p,int num 新增元素 tmp next tmp1 p tmp return p listnode insert listnode p,int num 新增元素 tmp ne...