2017-01-09 87 views
-2

有時,如果在C代碼中訪問數組超出範圍,您將不會收到運行時錯誤。如:C數組段錯誤

char array[1024]; 
char* ptr = array; 
*(ptr-10) = 'a'; 

//or 

*(ptr-4096) = 'a'; 

假設array是在棧上,我很好奇什麼是MIN SIZE,將讓*(ptr-SIZE) = 'a'扔分割故障在任何情況下?

例如:

*(ptr-4096*1024) = 'a' // this will always throw a segmentation fault 
*(ptr-4096*8) = 'a' // sometimes this will not throw a segmentation fault 

2017年1月10日,新加的:

我感到抱歉,沒有明確說明這個問題。 (

我想知道是不是隻是一個模糊的UNDEFINED假設堆高,堆是低,所以在內存佈局將是:。

high ********* 
    * stack * <- my array goes here 
    ********* 
    *  * 
    *  * <- ptr may be here 
    *  * 
    ********* 
    * heap * 
    ********* 
    * ??? * <- ptr may be here 
    ********* 

當然,我知道,

的問題是,C/C++實際上並沒有做任何邊界與問候陣列檢查,這取決於操作系統,以確保您正在訪問有效的內存

所以,上面的代碼會引起操作系統內核調用do_page_fault,並會嘗試找到vma的地址,並檢查是否爲vma->vm_start < address

現在,讓我們回過頭來,我問的問題:MIN SIZE,將讓*(ptr-SIZE) = 'a'扔分割故障在任何情況下。換句話說,我想知道do_page_fault可以承受的SIZE。這與C編譯器無關,而是您的操作系統如何保護您的內存。

+5

訪問數組越界是[未定義的行爲](http://en.cppreference.com/w/cpp/language/ub) – George

+0

像「未定義的行爲」中的「未定義」這個詞不清楚嗎?你在哪裏聽到/閱讀/ ..有這樣的訪問要求產生任何特定的行爲? – Olaf

+0

你最好重新提出這個問題,作爲一個操作系統問題,「用戶空間過程必須做什麼才能觸發分段錯誤?」而不是長久以來似乎是一個新手C編程問題的答案。 – TrentP

回答

4

A C符合標準的編譯器有權做任何事權利,如果你指數array[i]其中i小於0或大於1023

行爲在這種情況下被說成是不確定

試圖猜測會發生什麼是徒勞的。但是如果你好奇,你總是可以檢查生成的程序集。

+2

請注意,OP的問題中的引用是指針運算的結果,在這種情況下,它允許將指針指向「ptr + 1024」,而不是指向「ptr-1」。 '*(ptr + 1024)'當然是UB。 –