天天看點

5、對變量在棧上存儲順序,及函數傳回值與參數在棧上存放順序的思考(3)

我想接着讨論一下,如果是數組,那麼他與其它變量在棧上是如何配置設定存儲順序的。

我們已經知道,棧是從高位址到低位址生長,而數組是從低位址到高位址生長,那麼,這兩種不同的生長方式如何相容呢?于是我們設計如下程式。

#include "iostream"

using namespace std;

int main()

{

char ch1 = 'a';

char arr[5];

char ch2 = 'b';

cin >> arr;

printf("%p\n",&ch1);

printf("%p\n",&ch2);

printf("%p\n",arr);

printf("%p\n",arr+1);

cout << ch1 <<endl

     << ch2 <<endl

  << arr <<endl;

}

其在GCC下執行結果如下所示:

5、對變量在棧上存儲順序,及函數傳回值與參數在棧上存放順序的思考(3)

可見,棧是從高位址到低位址生長,而數組是從低位址到高位址生長這個結論不錯,但是,我們雖然申請了5個字元數組,可編譯器卻總共空出了31個位元組來。是以,我在想,那麼如果我輸入了31個以上的字元給arr,那不就溢出了嗎?

于是試驗了一個,果然是這個樣子的。

在VS上,我的機器上測試的給數組留出的空間是20個位元組。

繼續閱讀