2012-03-06 85 views
-7

這是一個編碼站點的問題....陣列內存分配

替換「?」與一個整數,使輸出爲4.

int main() 
{ 
    int arr[7]; 
    int b,c,d,a; 
    a=4; 
    printf("%d",arr[?]); 
    return 0; 
} 

我試圖找出結果,發現答案是-4。 現在,如果我聲明一個更多的變量(如代碼行4中的int b,c,d,e,a),答案就是-5。

請有人解釋編譯器如何行爲和內存分配的原因(負指數)。

+5

沒有有效回答這個 - 你可能能夠找到一個給出所需結果的值,但它將是編譯器特定的和特定於架構的,並將依賴於未定義的行爲 – 2012-03-06 13:19:31

+0

那麼您還沒有初始化'arr',所以你永遠不知道! – 2012-03-06 13:21:07

+1

誰問你這個問題不知道C編程。 – Lundin 2012-03-06 13:22:33

回答

2

首先,要注意的一點:從不編寫任何依賴於這種行爲的代碼,因爲它會因編譯器而異。

編輯:由於第一段落顯然不夠清楚:訪問數組越界是未定義的行爲,這意味着,編譯器可以產生一個程序,做任何事情的編譯器選擇。在這裏,我正在解釋海報的編譯器可能選擇做什麼,但它也可能是偶然的結果。

你的編譯器顯然已經選擇鋪陳變量如下(假設第一可變地址100結束):

  • 100:a
  • 104:d
  • 108:c
  • 112:b
  • 116:arr[0]
  • 120:arr[1]
  • ...
  • 140:arr[6]

由於arr開始於116和它的每個元素(int)的大小是4個字節,arr[-4]是在116 + 4 * (-4)= 100,這是a所在的位置。

+0

這是未定義的行爲,編譯器不能保證根據這段代碼給出任何合理的輸出,並且允許該程序崩潰並燒燬。你不能像這樣簡單地訪問數組越界。 – Lundin 2012-03-06 13:25:38

+0

對於我們所知的所有,編譯器可能也沒有做到這一點。也許在內存位置arr [-4]處有一些隨機數4,並且只是在這裏點擊。這也有可能吧?但是,另一方面,如果編譯器不會按照您所建議的方式放置變量,是否會有任何異常?只是好奇知道。謝謝 – Jay 2012-03-06 13:26:30

+0

@Lundin,真的嗎?這是未定義的行爲?不能通過閱讀其他10條評論來說明這一點!蓋伊只是試圖提出一個發生概率最高的案例。 – jn1kk 2012-03-06 13:39:32

1

C不檢查數組邊界。這意味着您可以使用一個索引,使您正在使用的內存位置不是爲陣列分配的內存的一部分。

當你這樣做時,你正在訪問內存中的其他位置。在這個例子中,下面的4個位置是留給整型變量bcda

所以,你出數組,進入變量的空間。

無論如何,這可能是因爲它依賴編譯器/架構,但我本來期望的正確答案是11(數組+ 4個變量的大小)

+0

哦,其他評論都是真的。這本質上是不安全的,而且你可以在C中做到這一點的唯一原因是它假設你不會這樣做,因此程序不檢查值(所以它會快一點)。切勿使用像IRL這樣的代碼 – SJuan76 2012-03-06 13:26:49