2012-06-10 137 views
4

我只是把我的C概念搞糊塗了,我對某些行爲感到困惑。考慮下面的代碼片段:動態數組混淆

#include<stdio.h> 
#include<stdlib.h> 

int main(){ 


    int * arr; 
    arr= malloc(3*sizeof(*arr)); 
    arr[0]=1; 
    arr[1]=2; 
    arr[2]=3; 
    arr[3]=4; 
    printf("value is %d \n", arr[3]); 

return 0; 


} 

問題是程序運行正常!據我瞭解,我爲3個整數的數組分配內存。所以基本上當我嘗試在arr[3]中設置一個值時,應該有一個segmentation fault,因爲沒有分配內存。但它工作正常,並打印值4. 這是一個奇怪的行爲,或者我認真需要修改基本C.請任何人都可以提供一些解釋我會高度讚賞它。 謝謝。

+2

已經看過這麼多次:[數組大於分配?]可能重複(http://stackoverflow.com/questions/8057584/array-is-larger-than-allocated) –

+0

我同意。這個或類似的問題似乎每隔幾天就會發布一次。 –

回答

10

從技術上講,它是未定義的行爲,這意味着任何事情都可能發生並不一定是分段錯誤。
只是你的程序不是一個有效的程序,你不應該寫無效的程序,並期望他們有效/無效的行爲。

+0

明白了。謝謝 :) – Abdullah

3

您的程序有undefined behaviour。這並不意味着它保證了段錯誤。失敗可能以其他方式表現出來(或根本沒有)。

6

您可能隨時都會遇到分段錯誤,這次你得到了「幸運」。這是undefined行爲,所以您可能會在其他時間出現seg故障。

C確實不是做任何邊界檢查,所以,例如,Java會抱怨,C很樂意做你所要求的任何事情,甚至對程序自己的損害。

這既是其主要優勢之一,也是其弱點。

2

這是基於我的內存是如何分配的理解我的猜測(它可能是錯的 - 因此將其否決,如果它是!):

arr[3]地址是在你的應用程序有權限的內存頁寫信給。我認爲4KB是一種常見的頁面大小。 malloc通話導致1頁面被映射到您的應用,其中您只使用第一個3*sizeof(*arr)字節,因此您的應用有權寫入arr[2]之後剩餘空間,但malloc尚未發佈。如果您要執行另一個malloc,則返回的地址將大於arr,並且可能等於arr[3]的地址。