溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C++讀取訪問(wèn)權(quán)限沖突引發(fā)異常問(wèn)題如何解決

發(fā)布時(shí)間:2022-10-14 14:53:42 來(lái)源:億速云 閱讀:2531 作者:iii 欄目:編程語(yǔ)言

這篇“C++讀取訪問(wèn)權(quán)限沖突引發(fā)異常問(wèn)題如何解決”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來(lái)看看這篇“C++讀取訪問(wèn)權(quán)限沖突引發(fā)異常問(wèn)題如何解決”文章吧。

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

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

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

可這并不會(huì)造成編譯錯(cuò)誤,也就是說(shuō),編譯器并不會(huì)在你編譯的時(shí)候就指出你訪問(wèn)數(shù)組越界了,這個(gè)時(shí)候可能還是“0 errors,0 warnings”

C++讀取訪問(wèn)權(quán)限沖突引發(fā)異常問(wèn)題如何解決

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

例如:下面這段對(duì)隊(duì)列和棧的操作

struct Stack              //這里定義了一個(gè)棧的結(jié)構(gòu)
{
	int data[maxSize];    //定義存儲(chǔ)棧中元素的數(shù)組
	int top;              //定義棧頂指針
};
struct Queue              //這里定義了一個(gè)隊(duì)列的結(jié)構(gòu)
{
	int elements[2000];   //定義一個(gè)長(zhǎng)度為2000的數(shù)組存放隊(duì)列中的元素
	int front;            //定義隊(duì)頭指針
	int rear;             //定義隊(duì)尾指針
};
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ù)實(shí)現(xiàn)出隊(duì)后進(jìn)棧操作
//outStack函數(shù)實(shí)現(xiàn)出棧后入隊(duì)操作,入隊(duì)后隊(duì)尾指針后移

編譯成功沒(méi)有報(bào)錯(cuò),但是運(yùn)行后拋出了讀取訪問(wèn)權(quán)限沖突的異常

C++讀取訪問(wèn)權(quán)限沖突引發(fā)異常問(wèn)題如何解決

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

C++讀取訪問(wèn)權(quán)限沖突引發(fā)異常問(wèn)題如何解決

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

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

C++讀取訪問(wèn)權(quán)限沖突引發(fā)異常問(wèn)題如何解決

將while的判定條件修改后,程序可正常運(yùn)行。

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

二、空指針異常

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

示例:鏈表中的操作

struct Node              //這里定義了一個(gè)結(jié)點(diǎn)
{
	int data;
	Node* next;
};
LinkListInvert::LinkListInvert(int arg[],int n)
{                            //重載構(gòu)造函數(shù)對(duì)鏈表進(jìn)行初始化
	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;
}

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

C++讀取訪問(wèn)權(quán)限沖突引發(fā)異常問(wèn)題如何解決

這里不難看出是因?yàn)闆](méi)有初始化first指針,使得first指針成為了一個(gè)空指針,指向了一個(gè)不確定的值,隨后進(jìn)行的操作

	Node* r = first;

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

LinkListInvert::LinkListInvert(int arg[],int n)
{
	first = new Node;           //此處為修改的地方,對(duì)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;
}

而修改的方式也很簡(jiǎn)單,對(duì)first指針進(jìn)行初始化后即可運(yùn)行成功。

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

C++讀取訪問(wèn)權(quán)限沖突引發(fā)異常問(wèn)題如何解決

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

以上就是關(guān)于“C++讀取訪問(wèn)權(quán)限沖突引發(fā)異常問(wèn)題如何解決”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI