指標相比陣列,更要小心使用

2021-08-20 06:35:39 字數 2284 閱讀 4380

問題丟擲:指標與陣列的對比

c++/c 程式中,指標和陣列在不少地方可以相互替換著用,讓人產生一種錯覺,以為兩者是等價的。

陣列要麼在靜態儲存區被建立(如全域性陣列),要麼在棧上被建立。陣列名對應著(而不是指向)一塊記憶體,其位址與容量在生命期內保持不變,只有陣列的內容可以改變。

指標可以隨時指向任意型別的記憶體塊,它的特徵是「可變 」 ,所以我們常用指標來操作動態記憶體。指標遠比陣列靈活,但也更危險。

下面以字串為例比較指標與陣列的特性。

#include

using

namespace

std;

int main()

執行結果:

然而程式執行到 p[0]=』x』; 時發生錯誤

字元陣列 a 的容量是 6 個字元,其內容為 hello\0。a 的內容可以改變,如 a[0]= 『x』。指標 p 指向常量字串「world 」(位於靜態儲存區,內容為 world\0 ) ,常量字串的內容是不可以被修改的。從語法上看,編譯器並不覺得語句 p[0]= 『x』有什麼不妥,但是該語句企圖修改常量字串的內容而導致執行錯誤。

深究除錯:究竟發生了什麼?

下圖是vs裡呼叫堆疊的資訊列表

注:crt即 c run-time library(c執行時庫),是 c 而非 c++ 語言世界的概念:取這個名字就是因為你的 c 程式執行時需要這些庫中的函式。

這裡的 _tmaincrtstartup() 是程式的入口點。聯結器對控制台程式設定的入口函式是maincrtstartup(),maincrtstartup()再呼叫main()

選中此行,並檢視crtexe.c中的源**。

#ifdef wprflag

int wmaincrtstartup(

#else /* wprflag */

int maincrtstartup(

#endif /* wprflag */

#endif /* _winmain_ */

void

)

注:crtexe.c是連線到crt dll的應用程式的實際啟動程式

*它呼叫使用者的主要例程[w]main()或[w]winmain;由wprflag選擇。

*執行c執行時庫初始化。

檢視斷點處的反彙編

char *p = "world"; // 注意 p 指向常量字串

00a15ef1 mov dword ptr [p],0a1cc78h

p[0] = 'x'; // 編譯器不能發現該錯誤

00a15ef8 mov eax,1

00a15efd imul ecx,eax,0

00a15f00 mov edx,dword ptr [p]

00a15f03 mov byte ptr [edx+ecx],58h

前面我們知道,在0x00a15f03處,寫入0x00a1cc78出現訪問衝突。顯然,mov dword ptr [p],0a1cc78h 告訴我們指標指向的是常量區,這裡的值是不允許被修改的。

相對應的:

char a = "hello"

;00a15eab mov eax,dword ptr ds:[f0458900h]

00a15eb0 mov cx,word ptr ds:[0a1cc74h]

00a15eb7 mov word ptr [ebp-0ch],cx

a[0] = 'x'

;00a15ebb mov eax,1

00a15ec0 imul ecx,eax,0

00a15ec3 mov byte ptr a[ecx],58h

ds是段位址,顯然陣列是放在靜態儲存區的,初始化的全域性變數和靜態變數在一塊區域,未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。程式結束後由系統釋放。

鏈式佇列相比陣列模擬佇列的優勢

前面在學習順序佇列時,由於順序表的侷限性,我們在順序佇列中實現資料入隊和出隊的基礎上,又對實現 做了改進,令其能夠充分利用陣列中的空間。鏈式佇列就不需要考慮空間利用的問題 因為鏈式佇列本身就是實時申請空間。因此,這可以算作是鏈式佇列相比順序佇列的乙個優勢 include include typede...

指標陣列和陣列指標的使用

問題 程式找錯or程式結果 include int main char p str 1 str 0 p 2 str 1 p 1 str 2 p 1 3 str 3 p 0 str 2 str 1 printf s n str 0 空 printf s n str 1 shenyang printf ...

陣列指標 指標陣列 二維陣列如何理解與使用

首先它是乙個指標,它指向乙個陣列,在32位系統下任何型別的指標所佔記憶體大小都為4個位元組,至於它指向的陣列佔多少位元組,具體要看陣列的大小。總之,陣列指標即為 指向陣列的大小 例如 int p 4 定義了乙個陣列指標,該指標變數儲存的是乙個陣列的首位址,它可以指向乙個含有4個整型元素的陣列。1 對...