最近,我在某技术论坛上看到一个有趣的问题:如何判断计算机系统中栈的增长方向?
首先让我简单介绍一下这个问题的背景。对于栈这种数据结构,大家应该不会陌生,它是一种后进先出的数据结构。据说,在一般的计算机系统中,栈存在着两种存放数据的方式,一种是向上增长的,一种是向下增长的,如图1所示。
图1 栈的两种增长方向
在图1的(a)中,栈是向上增长的,即数据A对应的地址小于数据B对应的地址;在图1的(b)中,栈是向下增长的,即数据A对应的地址大于数据B对应的地址。那么,我们怎样来判断自己所使用的系统中的栈的增长方向到底属于哪一种呢?
我们知道,作为一种常用的数据结构,栈主要用于存放程序中的局部变量和函数的输入参数。那么,我们就可以设计一个程序,在程序中通过比较某一个局部变量的前后两次的地址值来判断栈的增长方向。利用这个想法编写出来的程序如下所示:
- /**********************************************************************
- *版权所有(C)2017,ZhouZhaoxiong。
- *
- *文件名称:FindStackDirection.c
- *文件标识:无
- *内容摘要:判断栈的增长方向
- *其它说明:无
- *当前版本:V1.0
- *作者:ZhouZhaoxiong
- *完成日期:20170630
- *
- **********************************************************************/
- #include<stdio.h>
- //函数声明
- voidFindStackDirection(void);
- /**********************************************************************
- *功能描述:主函数
- *输入参数:无
- *输出参数:无
- *返回值:无
- *其它说明:无
- *修改日期版本号修改人修改内容
- *---------------------------------------------------------------------------
- *20170630V1.0ZhouZhaoxiong创建
- ***********************************************************************/
- intmain()
- {
- FindStackDirection();
- return0;
- }
- /**********************************************************************
- *功能描述:查找栈增长方向
- *输入参数:无
- *输出参数:无
- *返回值:无
- *其它说明:无
- *修改日期版本号修改人修改内容
- *--------------------------------------------------------------------------------
- *20170630V1.0ZhouZhaoxiong创建
- ***********************************************************************/
- voidFindStackDirection(void)
- {
- chariStackAddr=0;//用于获取栈地址
- staticchar*pStackAddr=NULL;//用于存放***个iStackAddr的地址
- if(pStackAddr==NULL)//***次进入
- {
- pStackAddr=&iStackAddr;//保存iStackAddr的地址
- FindStackDirection();//递归
- }
- else//第二次进入
- {
- if(&iStackAddr>pStackAddr)//第二次iStackDirection的地址大于***次iStackDirection,那么说明栈增长方向是向上的
- {
- printf("Stackgrowsup!\n");
- }
- elseif(&iStackAddr<pStackAddr)//第二次iStackDirection的地址小于***次iStackDirection,那么说明栈增长方向是向下的
- {
- printf("Stackgrowsdown!\n");
- }
- else
- {
- printf("Badstack!\n");
- }
- }
- }
我们可以看到,函数FindStackDirection中出现了递归调用,即***进入该函数的时候,将iStackAddr变量(局部变量)的地址值赋给pStackAddr,第二次进入该函数的时候,用新的iStackAddr变量的地址值与***次进入该函数时iStackAddr变量的地址值相比较,如果前者大于后者,那么说明栈增长方向是向上的,否则,说明栈增长方向是向下的。
将以上代码上传到Linux机器上,使用“gcc -g -o FindStackDirection FindStackDirection.c”命令对程序进行编译之后,运行“FindStackDirection”命令,结果如下:
- Stackgrowsdown!
即我所使用的系统中的栈的增长方向是向下的。大家也可以将以上代码在自己的系统中运行一下,看看结果是什么。
在大部分人(包括我)的印象中,栈的增长方向只有一种,那就是向上(如图1中的(a)),但程序运行出来的结果与我们预期的恰恰相反。从这点也可以看出计算机系统在设计上的精妙与复杂,里面有很多东西都值得我们细细研究的。
【本文是清一色专栏作者周兆熊的原创文章,作者微信公众号:周氏逻辑(logiczhou)】
©本文为清一色官方代发,观点仅代表作者本人,与清一色无关。清一色对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。本文不作为投资理财建议,请读者仅作参考,并请自行承担全部责任。文中部分文字/图片/视频/音频等来源于网络,如侵犯到著作权人的权利,请与我们联系(微信/QQ:1074760229)。转载请注明出处:清一色财经