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个字符数组,可编译器却总共空出了31个字节来。所以,我在想,那么如果我输入了31个以上的字符给arr,那不就溢出了吗?
于是试验了一个,果然是这个样子的。
在VS上,我的机器上测试的给数组留出的空间是20个字节。