有時,如果在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編譯器無關,而是您的操作系統如何保護您的內存。
訪問數組越界是[未定義的行爲](http://en.cppreference.com/w/cpp/language/ub) – George
像「未定義的行爲」中的「未定義」這個詞不清楚嗎?你在哪裏聽到/閱讀/ ..有這樣的訪問要求產生任何特定的行爲? – Olaf
你最好重新提出這個問題,作爲一個操作系統問題,「用戶空間過程必須做什麼才能觸發分段錯誤?」而不是長久以來似乎是一個新手C編程問題的答案。 – TrentP