自动变量堆栈

《C++Primer Plus》第9章中提到,函数中正常声明的变量都会进入自动变量堆栈。让我困惑的是两点:

1.是每个函数都有一个自己的堆栈还是所有函数共用一个大堆栈;

2.早期的C语言要求,函数声明都必须在最前面,否则可能出错,是否和此有关(即函数A最前面的声明构成堆栈后,A内部调用到的函数B紧贴A堆栈又构建了一个堆栈,如果此时再在A中声明变量,将导致堆栈溢出)

 

实验方案如下:

#include <stdio.h>
void print(int* zzz)
{
int b=3;
printf("int=%p\n",zzz);
printf("int=%p\n",&b);
}
int main()
{
int a1=3,a2=4;
print(&a1);
int c=5;
print(&c);
return 0;
}

实验结果如下:

int=0x7ffee465b27c
int=0x7ffee465b254
int=0x7ffee465b280
int=0x7ffee465b254

 

我们都知道int是32位四字节,可以看到main函数建立的第二个变量地址正好比第一个变量地址大4(0x80-0x7c),而且print中的c地址不变,而且在低地址方向,距离较远。在此版本的编译器下,可以在函数中间声明变量,可以看到新变量。

结论:

1.每个函数有自己独立的自动变量堆栈。

2.函数内,生长方向为从低地址到高地址。

3.函数间,生长方向为从高地址到低地址。

 

将print中的b改为数组,结果如下:

int=0x7ffded58e96c
int=0x7ffded58e7b0
int=0x7ffded58e970
int=0x7ffded58e7b0

可以看出,函数内变量增多,会导致函数的自动变量堆栈容量变大。所以我们能够看到,对于确定大小的变量,编译器能够提前分配好空间,但是如果待分配空间取决于外部输入,则无法提前分配好适当大小的空间,这种情况下,有可能出现溢出,所以常见的办法是使用new关键字向堆请求需要的空间。

后来看到这篇,感觉受益良多:

传送门

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值