我很難找到這樣的問題的具體答案,但我會解釋我認爲這應該(不)工作的方式,也許有人可以告訴我我錯在哪裏。C++循環,範圍和堆棧(爲什麼這個工作?)
我在棧中創建一個大小爲10的整數數組。然後我使用for循環將整數0-9加載到該數組中。當for循環結束時,堆棧指針返回到初始化arr1後的位置,但這些值仍然存在於內存中,並且數組仍然指向它們。
然後,我使用另一個for循環來氾濫堆棧,它應該覆蓋在第一個for循環中創建的值,現在當我去訪問arr1中的值時,它們應該指向值爲5000的整數
當我打印數組時,它仍然打印出數字0-9。爲什麼這個工作?我認爲在一個循環中聲明的數據在超出範圍時從堆棧中彈出。謝謝
int main(void)
{
int arr1[10];
for(int i = 0; i < 10; i++)
arr1[i] = i;
for(int i = 0; i < 500; i++)
int a = 5000;
for(int i = 0; i < 10; i++)
cout << arr1[i] << endl;
system("PAUSE");
return 0;
}
我的印象是C++中的一個數組只是一個指向內存中某個位置的指針,這個位置的數據順序依次存在。因此,如果這些值是在for循環中創建的,並且該循環超出了範圍,那麼數組指向的值是否會從堆棧中彈出?謝謝 –
@JohnSavage:你的印象不正確。 C++中的數組不是指向內存中存在序列的位置的指針,它是*序列。值不是在'for'循環中創建的,它們是在創建數組時創建的(儘管在這種情況下它們沒有被初始化,這會帶來它自己的危險)。它們在'for'循環中被修改。 –
@JohnSavage你是正確的,在一個數組變量*行爲*像一個指針(並可以很容易地轉換爲一個指針)。但是,對於靜態數組(在你的例子中),當你聲明它時,整個數組實際上被創建*(添加到堆棧)。循環內的代碼只是分配(即改變)數組中的值。 –