2014-02-07 79 views
0

有人可以解釋爲什麼此代碼的作品,即使我分配內存只用於2陣列的數組?爲什麼數組大於分配給它的內存?

int main(void){ 

st=(int *)malloc(sizeof(int)*2); 
int j; 
for(j=0; j<5; j++){ 
    st[j]=j*10000; 
} 
} 

雖然下面的代碼將無法正常工作......

int main(void){ 

st=(int *)malloc(sizeof(int)*2); 
int j; 
for(j=0; j<6; j++){ 
    st[j]=j*10000; 
} 
for(j=0; j<6; j++) 
    printf("st[%d]=%d\n",j,st[j]); 
} 

據我所知,我不應該能夠把一些在ST [J]對於j> 1。

非常感謝!

+0

永遠不會投放'malloc'的結果。 – devnull

+1

@devnull關於這個問題存在重大爭議。 –

+3

@devnull說了什麼,即[請不要在C](http://stackoverflow.com/a/605858/28169)中投射'malloc()'的返回值。 – unwind

回答

4

訪問未分配的內存是「未定義的行爲」。這意味着程序可以通過運行時錯誤退出,但不是必須的。

許多編譯器在分配內存的某些保護措施的基礎上構建代碼,以便在寫入超出時導致崩潰,但這些不必在任何條件下工作。在你的特殊情況下,似乎在數組邊界上的12個字節不會觸發它,但是會有16個字節。但這也是你不能也不應該依賴的東西。根據其他情況,另一個程序,使用其他選項編譯的相同程序甚至不同時間執行的相同程序可能會有所不同。

0

您正在爲已分配的數組寫入空間。它調用未定義的行爲。在這種情況下可能會發生任何事

1

在第一個示例中,您寫入的內存永遠不會再被讀取。只要它的行爲相同,就可以檢測到符合標準的編譯器來消除代碼。由於該程序不需要崩潰,因此編譯器可以用空程序替換它。

相關問題