看過這個,你可能更瞭解指標3

辰末之星發表於2024-11-17

我們來看下圖

運算的結果會是什麼呢?
接下來開始我們的分析。

****在1中

arr被單獨放在strlen函式中,表示陣列的首元素地址。
由於陣列中沒有\0,因此strlen在計算arr長度的時候並不會出現正常結果,
但是也不至於造成死迴圈。
因為在arr後的空間中往往會存在0等元素存放在地址中,
這裡記憶體的0就相當於\0,會使strlen函式停下來。但我們並不知道\0與陣列arr之間的“距離”,

所以第一題的結果會是一個隨機值

****在2中

arr+0表示首元素的地址,在用法上與arr是一樣的,
而且由於指向的都是首元素的地址,

所以連輸出結果的隨機值也是相等的
***在3中
arr表示首元素地址,
arr則表示第一個元素,即a。當a傳入strlen時,
編譯器識別時只認識其ASCII值,我們知道a的ASCII值為97,
這樣97就被當做地址傳入函式strlen中了。
在strlen的視角中,這97妥妥的是個非法地址,

因此就會報錯。
如下圖所示

****在4中
arr[1]表示第二個元素,即b,b的ASCII值為98
,傳入函式strlen中後也是個非法地址,
同樣會報錯

****在5中

由於arr與&結合,這裡的arr表示整個陣列,&arr表示整個陣列的地址。
strlen會從第一個元素開始數,知道遇到\0為止。
當然這裡的結果也是隨機值,

而已與1中的隨機值是等大的

****在6中,
&arr+1表示跳過了一個陣列大小後到達的位置,
即下圖所示

當然我們也同樣不知道\0的位置,因此這題的結果也同樣是隨機值。
但是如果在細節考究一點,我們知道6的答案是從&arr+1的位置開始數的。
arr陣列的型別為char ,且元素個數為6,因此陣列大小為6。

由此我們能知道這個隨機值恰好等於1的隨機值減去6個位元組。

****在7中

&arr[0]表示首元素的地址,+1則表示跳過一個元素大小,arr中的陣列型別為char,
因此跳過了一個char型別的大小,則跳到了arr[1]的地址。
無法得知\0的位置,這一題同樣也是隨機值,

而根據上一題的做法我們可以得知這一題的隨機值等於1的隨機值減去1

****最後,讓我們剔除掉3和4這兩個報錯的再執行試試

可以看到這個除了3和4之外的都是可以執行的,
而這裡運算出的隨機值是42,說明從首元素開始經歷了42個元素大小才找到\0。
而且第6題的答案為36,恰好是我們分析的42-6
第7題的答案是41,恰好是41-1
這說明我們的分析應該沒有什麼問題

相關文章