用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...