乙個C語言問題,迴圈之後引數值為什麼發生變化了?

時間 2021-05-30 10:56:43

1樓:李展發(藏雲)

讓老夫試試終結這個問題吧。

首先你要了解對於函式內宣告的變數(非靜態變數)它是儲存在棧中的。

進入函式後首先壓入棧的變數就是你的引數。也就是N。然後再壓入你宣告的第乙個變數,也即是陣列bucketArray.

關鍵就在這裡,N跟BUCKETARRAY這兩個變數是放在一起的。

而你在FOR迴圈中又多迴圈了一次。for(i = 0; i <= 1001; i++)。而事實上你用bucketArray[1001]時,已經越過陣列範圍了。

那麼bucketArray[1001]指向的既然不是bucketArray中的變數,那到底是什麼?事實上就是N.因為bucketArray[1001]相當於*(bucketArray+1001)。

C語言是不會幫你檢查是否越過陣列範圍的。即使越過了,他還是照樣訪問bucketArray後的第1001個元素。而在這裡因為N跟bucketArray是放在一起的,第1001個元素就是N,對N進行賦值0.

N的值當然也就被改變了。

2樓:間接性寫程式碼

如果題主是剛剛學C語言不建議用IDE開發,你在mac下可以使用vim 或者emacs 文字編輯器,用gcc編譯器,編譯原始檔。

具體上面的問題,顯然你的陣列越界了定義1001個元素,你就只能<1001 或者<=1000;

3樓:pansz

for迴圈中陣列下標訪問越界。導致修改了未知的資料,具體修改了誰,是未定義行為。在你的例子中剛好是修改了引數值。

把for迴圈中小於等於號改成小於號。

請問乙個c語言的問題?

土地測量員 反對那些說看IEEE 754浮點數標準的 暫且不談c標準裡浮點數表示方法是implementation defined 即使你知道了IEEE754浮點標準,也不能解釋輸出的結果。因為用 d輸出浮點數是未定義行為。同理,也反對樓上通過看彙編解釋輸出結果的方法,因為這解釋只在特定實現下有效。...

C語言乙個運算數為有符號數,另乙個為無符號數的轉換?

朱涵俊 比較跟運算是不一樣的 x y不代表x y 0 運算會溢位,但是比較永遠不會,負數永遠小於正數,無論是int,long,char,float,double。比如 1的char是0xff,還是小於1的int轉換的時候,會公升級到2邊最大字長,如char,int公升級到int,char,long公...

c語言的乙個疑問?

最佳答案就在C語言的標準裡,C99標準裡定義了6種statement 語句 for語句屬於 iteration statementif語句屬於 selection statement所謂花括號 屬於compound statement而帶分號 的語句屬於expression statement這裡需...