2015-07-02 61 views
-3
void go() 
{ 
    //{1} 
    char buffer[2]; 
    gets(buffer); 
    //{2} 
    cout << allow; 
} 

我試圖運行2例上述過程:緩衝區溢出 - 變量的變化

-1st:我宣佈「INT允許;」在位置1

-2nd:我聲明「int allow;'在位置2

在這兩種情況下,當我試圖輸入字符串「123」(不帶引號)時,allow的值是51. 但是,當我閱讀有關內存佈局時,僅在第一種情況,堆棧中「允許」的位置在緩衝區之前,這意味着當字符串比緩衝區長時,「允許」的值被改變。

然後,我嘗試在兩個位置聲明「char sth [10]」。這一次,只有當我在第一個位置宣佈時,它的價值纔會改變。

任何人都可以解釋發生了什麼?

+0

你設置允許任何其他值之前'得到...'? – Amit

+5

不能保證變量如何根據聲明的位置在內存中進行佈局。 –

+0

哇,你真的想要在應用程序級別檢測堆棧粉碎?無論如何,我第二次是Paul Tomblin的評論。 – balajeerc

回答

3

由於通過溢出更改allow的值爲Undefined Behavior,編譯器可能甚至根本沒有變量allow,而是在使用優化編譯時將代碼更改爲cout << 0。這是而不是有效的方法來檢查溢出,無論你放在哪裏allow

要強調:你觀察到的所有allow的變化都是UB的結果。在標準中對此沒有任何保證。你可以繼續推測,爲什麼你今天在你的系統上看到這個輸出,用這個工具鏈,但結果可能會改變爲任何東西(如你的程序移動你的草坪或盜取皇冠上的寶石)任何原因。

事實上,沒有辦法安全地使用gets。這就是爲什麼它在當前的C++和C標準中被刪除。

您可以使用std::stringstd::getline代替:

string buffer; 
std::getline(std::cin, buffer);