我們來看下圖
運算的結果會是什麼呢?
接下來開始我們的分析。
****在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
這說明我們的分析應該沒有什麼問題