2011-12-15 56 views
2

爲什麼下面的代碼會被編譯和運行。C++訪問靜態數組之外的界限vs新數組?

我已經創建了一個整數數組,並將它的大小賦值爲10,爲什麼程序不返回一個錯誤,我試圖在for循環內部訪問數組之外​​的元素?另外,我想了解new的概念,我的用法是否正確(我沒有分配多少內存*數組需要),這是我的理解,new允許我創建一個動態大小的數組(我沒有分配多少內存*數組需要)這意味着我可以在運行時無限期地增加這個數組的大小,如果我錯了,請糾正我)。如果這是正確的,我使用新的或簡單地分配數組[];有什麼區別。因爲這兩個顯然允許我在運行時增加我的數組的大小,這可以看到這個例子。我知道範圍,堆棧和堆的差異,因此假定兩個變量只在main中聲明,並使用下面的代碼作爲示例。

http://ideone.com/Tbud1

#include <iostream> 
using namespace std; 

int main() 
{ 
int array[10]; 
int *arrays; 
arrays = new int(); 
for (int i=0; i<450; i++) 
{ 
    arrays[i] = i; 
    cout << arrays[i] << " "; 
    array[i] = i; 
    cout << array[i] << endl; 
} 
return 0; 
} 
+1

因爲這不是編譯錯誤,所以它是未定義的行爲。 – 2011-12-15 19:43:03

回答

3

訪問超出陣列結果的邊界元件未定義行爲
編譯器不需要在這些有保證的未定義行爲的情況下做任何特定的事情。
可能發生的任何事情都可能發生,您的程序可能會崩潰或者顯示不穩定的行爲,這是標準所允許的。

參考:

C++標準部1.3.24狀態:

允許不確定的行爲的範圍從具有不可預知的結果完全無視的情況下,以在形成文件的方式翻譯或程序執行期間表現環境特徵(有或者沒有發佈診斷消息),終止翻譯或執行(通過發佈診斷消息)。

您對new的理解不正確。 new允許您在freestore(a.k.a堆​​)上分配固定數量的內存。如果擴展分配的內存的邊界,它不會分配額外的內存。您需要確保您必須分配足夠的內存,以免超出界限。

在你的程序中,您嘗試分配內存等於10個數組元素,所以你應該做的:

arrays = new int[10]; 

另外,不要忘記調用delete[]一旦你使用分配的內存中完成或者它的結果在內存泄漏。

delete []arrays; 

如果你需要的數據結構,按您的使用情況自動增加,C++提供了在std::vector形式。