最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++讀取訪問權(quán)限沖突引發(fā)異常問題的原因分析

 更新時間:2021年07月01日 12:46:55   作者:Gabriel17  
C語言是一門通用計算機編程語言,廣泛應(yīng)用于底層開發(fā),最近在用C++寫代碼時經(jīng)常會遇到“引發(fā)了異常: 讀取訪問權(quán)限沖突,所以這篇文章主要給大家介紹了關(guān)于C++讀取訪問權(quán)限沖突引發(fā)異常問題的相關(guān)資料,需要的朋友可以參考下

用C++寫代碼時經(jīng)常會遇到“引發(fā)了異常: 讀取訪問權(quán)限沖突?!边@樣的錯誤提示,這種情況產(chǎn)生原因主要有兩點:

一、訪問數(shù)組越界

當(dāng)采用線性表的順序結(jié)構(gòu),例如順序表、隊列、棧等,用數(shù)組存儲數(shù)據(jù)時,若將要讀取數(shù)據(jù)的位置超出了當(dāng)前數(shù)組的長度,就會發(fā)生數(shù)組訪問越界的狀況。

可這并不會造成編譯錯誤,也就是說,編譯器并不會在你編譯的時候就指出你訪問數(shù)組越界了,這個時候可能還是“0 errors,0 warnings”

你還在暗暗慶幸自己的代碼沒有bug,但是當(dāng)你運行之后就會拋出訪問權(quán)限沖突的異常。

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

struct Stack              //這里定義了一個棧的結(jié)構(gòu)
{
	int data[maxSize];    //定義存儲棧中元素的數(shù)組
	int top;              //定義棧頂指針
};
struct Queue              //這里定義了一個隊列的結(jié)構(gòu)
{
	int elements[2000];   //定義一個長度為2000的數(shù)組存放隊列中的元素
	int front;            //定義隊頭指針
	int rear;             //定義隊尾指針
};
while (queueA->front < queueA->rear || queueB->front < queueB->rear) 
{
	queueA->front++;
	inStack(stack, queueA->elements[queueA->front]);
	outStack(stack, queueA);
	queueB->front++;
	inStack(stack, queueB->elements[queueB->front]);
	outStack(stack, queueB);
}
//inStack函數(shù)實現(xiàn)出隊后進棧操作
//outStack函數(shù)實現(xiàn)出棧后入隊操作,入隊后隊尾指針后移

編譯成功沒有報錯,但是運行后拋出了讀取訪問權(quán)限沖突的異常

我們查看此時局部變量的狀態(tài)可以發(fā)現(xiàn),隊列A 的隊頭指針和隊尾指針都指向了異常的下標(biāo)

這顯然發(fā)生了訪問越界的情況,因為長度為2000的數(shù)組,下標(biāo)的取值應(yīng)該是0~1999。

后來,發(fā)現(xiàn)錯誤出在while循環(huán)判定的條件。本意上是當(dāng)A、B之間任意一個隊列中的元素為空的時候就跳出循環(huán),但是錯將判定條件中的邏輯且寫成了邏輯或,導(dǎo)致遲遲不能跳出循環(huán),最終隊列A的隊頭指針和隊尾指針在不斷的循環(huán)操作中超出了數(shù)組邊界,發(fā)生了讀取訪問權(quán)限沖突的異常。

將while的判定條件修改后,程序可正常運行。

所以遇到讀取訪問權(quán)限沖突的提示,如果異常發(fā)生在讀取數(shù)組中數(shù)據(jù)的時候,可以優(yōu)先考慮是否是因為某種操作不當(dāng)導(dǎo)致訪問數(shù)組越界了。

二、空指針異常

這主要發(fā)生在通過指針讀取數(shù)據(jù)時,比如在使用鏈表的過程中。

示例:鏈表中的操作

struct Node              //這里定義了一個結(jié)點
{
	int data;
	Node* next;
};
LinkListInvert::LinkListInvert(int arg[],int n)
{                            //重載構(gòu)造函數(shù)對鏈表進行初始化
	Node* r = first;
	Node* s = nullptr;
	for (int i = 0; i < n; i++)
	{
		s = new Node;
		s->data = arg[i];
		r->next = s;
		r = s;
	}
	r->next = nullptr;
}

代碼編譯無錯誤,運行后發(fā)生讀取訪問權(quán)限異常

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

	Node* r = first;

使r指針也成為了一個空指針,在進行接下來的操作時就拋出了讀取權(quán)限沖突的異常。

LinkListInvert::LinkListInvert(int arg[],int n)
{
	first = new Node;           //此處為修改的地方,對first初始化
	Node* r = first;
	Node* s = nullptr;
	for (int i = 0; i < n; i++)
	{
		s = new Node;
		s->data = arg[i];
		r->next = s;
		r = s;
	}
	r->next = nullptr;
}

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

類似的,由指針未初始化而引發(fā)的讀取訪問權(quán)限異常,還會給出諸如 0XCCCCCCCC、0xCDCDCDCD的異常提示。

當(dāng)然,不止鏈表,空指針異常還會出現(xiàn)在很多其他情況下,比如在數(shù)據(jù)庫查詢,指針未初始化時也會產(chǎn)生空指針異常。

總結(jié)

到此這篇關(guān)于C++讀取訪問權(quán)限沖突引發(fā)異常問題的文章就介紹到這了,更多相關(guān)C++讀取訪問權(quán)限沖突內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 對比C語言中execv相關(guān)的執(zhí)行文件的三個函數(shù)

    對比C語言中execv相關(guān)的執(zhí)行文件的三個函數(shù)

    這篇文章主要介紹了對比C語言中execv相關(guān)的執(zhí)行文件的三個函數(shù),分別為execv()函數(shù)和execve()函數(shù)以及execvp()函數(shù),需要的朋友可以參考下
    2015-08-08
  • C語言實現(xiàn)簡單掃雷游戲

    C語言實現(xiàn)簡單掃雷游戲

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)簡單掃雷游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • C++結(jié)合QT實現(xiàn)帶有優(yōu)先級的計算器功能

    C++結(jié)合QT實現(xiàn)帶有優(yōu)先級的計算器功能

    這篇文章主要介紹了C++結(jié)合QT實現(xiàn)帶有優(yōu)先級的計算器,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • c++將vector迭代器轉(zhuǎn)換為指針的實現(xiàn)方式

    c++將vector迭代器轉(zhuǎn)換為指針的實現(xiàn)方式

    這篇文章主要介紹了c++將vector迭代器轉(zhuǎn)換為指針的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C語言的運算符你了解嗎

    C語言的運算符你了解嗎

    這篇文章主要介紹了C語言中的運算符,本文給大家介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下,希望能給你帶來幫助
    2021-08-08
  • C語言實現(xiàn)隨機發(fā)撲克牌

    C語言實現(xiàn)隨機發(fā)撲克牌

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)隨機發(fā)撲克牌,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C++實現(xiàn)一個簡單消息隊列的示例詳解

    C++實現(xiàn)一個簡單消息隊列的示例詳解

    消息隊列在多線程的場景有時會用到,尤其是線程通信跨線程調(diào)用的時候,就可以使用消息隊列進行通信。本文將利用C++實現(xiàn)一個簡單的消息隊列,感興趣的可以了解一下
    2022-12-12
  • C++ Boost Optional示例超詳細講解

    C++ Boost Optional示例超詳細講解

    Boost是為C++語言標(biāo)準(zhǔn)庫提供擴展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標(biāo)準(zhǔn)庫的后備,是C++標(biāo)準(zhǔn)化進程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫提供擴展的一些C++程序庫的總稱
    2022-11-11
  • 利用C++模擬實現(xiàn)STL容器:list

    利用C++模擬實現(xiàn)STL容器:list

    列表是一種順序容器,它允許在序列中的任何位置執(zhí)行常量時間插入和刪除操作,并允許在兩個方向上進行迭代。本文將利用C++模擬實現(xiàn)list,希望對大家有所幫助
    2022-12-12
  • 詳解VS2010實現(xiàn)創(chuàng)建并生成動態(tài)鏈接庫dll的方法

    詳解VS2010實現(xiàn)創(chuàng)建并生成動態(tài)鏈接庫dll的方法

    在某些應(yīng)用程序場景下,需要將一些類或者方法編譯成動態(tài)鏈接庫dll,以便別的.exe或者.dll文件可以通過第三方庫的方式進行調(diào)用,下面就簡單介紹一下如何通過VS2010來創(chuàng)建動態(tài)鏈接庫
    2022-12-12

最新評論

凤城市| 米易县| 伊宁县| 江安县| 牡丹江市| 黄大仙区| 孟村| 齐河县| 靖安县| 德格县| 博客| 高陵县| 襄汾县| 罗城| 临漳县| 墨脱县| 雷州市| 翁牛特旗| 娱乐| 合作市| 延安市| 颍上县| 依兰县| 明水县| 昂仁县| 弥勒县| 乌拉特前旗| 云霄县| 陈巴尔虎旗| 广安市| 宁安市| 大名县| 泰宁县| 陆河县| 离岛区| 德清县| 娄烦县| 永平县| 无为县| 义马市| 喀喇沁旗|