這是一個編碼站點的問題....陣列內存分配
替換「?」與一個整數,使輸出爲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。
請有人解釋編譯器如何行爲和內存分配的原因(負指數)。
這是一個編碼站點的問題....陣列內存分配
替換「?」與一個整數,使輸出爲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。
請有人解釋編譯器如何行爲和內存分配的原因(負指數)。
首先,要注意的一點:從不編寫任何依賴於這種行爲的代碼,因爲它會因編譯器而異。
編輯:由於第一段落顯然不夠清楚:訪問數組越界是未定義的行爲,這意味着,編譯器可以產生一個程序,做任何事情的編譯器選擇。在這裏,我正在解釋海報的編譯器可能選擇做什麼,但它也可能是偶然的結果。
你的編譯器顯然已經選擇鋪陳變量如下(假設第一可變地址100結束):
a
d
c
b
arr[0]
arr[1]
arr[6]
由於arr
開始於116和它的每個元素(int
)的大小是4個字節,arr[-4]
是在116 + 4 * (-4)= 100,這是a
所在的位置。
這是未定義的行爲,編譯器不能保證根據這段代碼給出任何合理的輸出,並且允許該程序崩潰並燒燬。你不能像這樣簡單地訪問數組越界。 – Lundin 2012-03-06 13:25:38
對於我們所知的所有,編譯器可能也沒有做到這一點。也許在內存位置arr [-4]處有一些隨機數4,並且只是在這裏點擊。這也有可能吧?但是,另一方面,如果編譯器不會按照您所建議的方式放置變量,是否會有任何異常?只是好奇知道。謝謝 – Jay 2012-03-06 13:26:30
@Lundin,真的嗎?這是未定義的行爲?不能通過閱讀其他10條評論來說明這一點!蓋伊只是試圖提出一個發生概率最高的案例。 – jn1kk 2012-03-06 13:39:32
C不檢查數組邊界。這意味着您可以使用一個索引,使您正在使用的內存位置不是爲陣列分配的內存的一部分。
當你這樣做時,你正在訪問內存中的其他位置。在這個例子中,下面的4個位置是留給整型變量b
,c
,d
和a
所以,你出數組,進入變量的空間。
無論如何,這可能是因爲它依賴編譯器/架構,但我本來期望的正確答案是11
(數組+ 4個變量的大小)
哦,其他評論都是真的。這本質上是不安全的,而且你可以在C中做到這一點的唯一原因是它假設你不會這樣做,因此程序不檢查值(所以它會快一點)。切勿使用像IRL這樣的代碼 – SJuan76 2012-03-06 13:26:49
沒有有效回答這個 - 你可能能夠找到一個給出所需結果的值,但它將是編譯器特定的和特定於架構的,並將依賴於未定義的行爲 – 2012-03-06 13:19:31
那麼您還沒有初始化'arr',所以你永遠不知道! – 2012-03-06 13:21:07
誰問你這個問題不知道C編程。 – Lundin 2012-03-06 13:22:33