2013-02-19 23 views
0

所以我正在使用一個動態分配的數組,並將其設置爲保存5個元素,因此應該是0-4。我做了一個函數來保留它,如果有必要的話,但是我想看看當我在[5]中給數組賦值時我是否會遇到程序崩潰。但是,沒有錯誤,直到[6]。動態分配數組的有趣行爲

這裏是我的代碼:

int* dynamic_arr; 
dynamic_arr = new int[5]; 

for(int i = 0; i <= 100; i++){ 
    dynamic_arr[i] = i; 
    used++; 
    cout << dynamic_arr[i]<<endl; 
} 

下面是輸出:

0 //i[0] 
1 //i[1] 
2 //i[2] 
3 //i[3] 
4 //i[4] 
5 //i[5] <-- should be out of range 

,它崩潰之後。

爲什麼我能夠給數組的一部分分配一個值,因爲沒有更好的術語,這個值超出了範圍?

感謝

OpSrcFTW

編輯:欣賞答案的傢伙,謝謝。在下次發佈快速回復之前,我會多讀些書,對不起。

+3

UB表示未定義的行爲! – billz 2013-02-19 23:33:27

+0

未定義的行爲會在你不注意時觸動你。 – 0x499602D2 2013-02-19 23:35:54

+0

這確實很有趣。我總是期待看到跳舞的獨角獸。這很奇怪,他們沒有出現在你的機器上! – stefan 2013-02-19 23:36:58

回答

5

超出數組末尾的訪問會產生未定義的行爲。它不一定會導致崩潰。任何事情都可能發生。

+0

也謝謝你的回覆。正如我在迴應@juanchopanza時所說的那樣,這響起了一個鐘聲。我應該記住這一點。謝謝! – OpenSrcFTW 2013-02-19 23:36:26

4

訪問超出其範圍的數組是未定義的行爲。任何事情都可能發生,它不必是可重複的,並且試圖「理解」你認爲可能存在的任何模式沒有多大意義。

+0

好吧,這是公平的。出於某種原因,我曾認爲它會一直崩潰。但是,你的陳述敲響了一個鐘聲,而且當我考慮發生在較低層次上的事情時,這是有道理的。這也是一個快速反應!只要SO讓我,我會選擇這個作爲第一個答案。 – OpenSrcFTW 2013-02-19 23:36:01

+2

典型的平臺很難讓它永遠崩潰。考慮是否有更大的內存塊被重用。或者考慮一下已經使用的兩塊內存之間是否有稍大的差距。而且大多數平臺只能在頁面邊界進行硬件內存保護,因此它必須在頁面末尾排列訪問權限,這意味着在開始之前的訪問不會總是崩潰,除非分配恰好是確切的多個頁面邊界。 – 2013-02-19 23:43:30

4

訪問超出數組大小將產生未定義的行爲。 未定義的行爲包括諸如代碼崩潰,工作得很好,在一臺計算機上工作而不是另一臺計算機,重新啓動計算機或摧毀整個Universe等內容。

+2

我不小心摧毀了整個宇宙,我討厭它。這是一個調試... – 2013-02-19 23:39:10

2

正如其他人已經指出,你有未定義的行爲,所以儘管崩潰是可能的,代碼也可以工作。

在像您這樣的情況下,在您訪問時出現工作情況過了您分配的內存末尾是相當常見的。管理免費商店內存的代碼通常會將您的請求大小調整爲它發現的下一個大小,例如2的冪。因此,在沒有可見問題的情況下,至少有一點內存超出了您所要求的範圍並不罕見。

當然,你不能指望 - 即使使用相同標誌的同一個編譯器也是如此,例如,標準庫可以根據目標機器,當有大量RAM可用時使用更多的填充來優化速度,而當可用空間不足時減少填充以減少內存使用量。

因此,不,你不能在任何特定點取決於崩潰 - 但就這還不算你可以測試獲得通過的地方或想這是你只需要擔心,如果你的東西將移植代碼。