一个有趣的计算机系统问题---判断栈的增长方向

最近,我在某技术论坛上看到一个有趣的问题:如何判断计算机系统中栈的增长方向?

枞阳网站建设公司成都创新互联,枞阳网站设计制作,有大型网站制作公司丰富经验。已为枞阳成百上千家提供企业网站建设服务。企业网站搭建\成都外贸网站建设公司要多少钱,请找那个售后服务好的枞阳做网站的公司定做!

首先让我简单介绍一下这个问题的背景。对于栈这种数据结构,大家应该不会陌生,它是一种后进先出的数据结构。据说,在一般的计算机系统中,栈存在着两种存放数据的方式,一种是向上增长的,一种是向下增长的,如图1所示。

图1 栈的两种增长方向

在图1的(a)中,栈是向上增长的,即数据A对应的地址小于数据B对应的地址;在图1的(b)中,栈是向下增长的,即数据A对应的地址大于数据B对应的地址。那么,我们怎样来判断自己所使用的系统中的栈的增长方向到底属于哪一种呢?

我们知道,作为一种常用的数据结构,栈主要用于存放程序中的局部变量和函数的输入参数。那么,我们就可以设计一个程序,在程序中通过比较某一个局部变量的前后两次的地址值来判断栈的增长方向。利用这个想法编写出来的程序如下所示:

 
 
 
 
  1. /********************************************************************** 
  2. * 版权所有 (C)2017, Zhou Zhaoxiong。 
  3. * 文件名称:FindStackDirection.c 
  4. * 文件标识:无 
  5. * 内容摘要:判断栈的增长方向 
  6. * 其它说明:无 
  7. * 当前版本:V1.0 
  8. * 作    者:Zhou Zhaoxiong 
  9. * 完成日期:20170630 
  10. **********************************************************************/ 
  11. #include  
  12.  
  13. // 函数声明 
  14. void FindStackDirection(void); 
  15.  
  16. /********************************************************************** 
  17. * 功能描述:主函数 
  18. * 输入参数:无 
  19. * 输出参数:无 
  20. * 返 回 值:无 
  21. * 其它说明:无 
  22. * 修改日期           版本号      修改人                  修改内容 
  23. * --------------------------------------------------------------------------- 
  24. * 20170630         V1.0     Zhou Zhaoxiong          创建 
  25. ***********************************************************************/ 
  26. int main() 
  27.     FindStackDirection(); 
  28.  
  29.     return 0;  
  30.  
  31.  
  32. /********************************************************************** 
  33. * 功能描述:查找栈增长方向 
  34. * 输入参数:无 
  35. * 输出参数:无 
  36. * 返 回 值:无 
  37. * 其它说明:无 
  38. * 修改日期         版本号          修改人              修改内容 
  39. * -------------------------------------------------------------------------------- 
  40. * 20170630        V1.0     Zhou Zhaoxiong          创建 
  41. ***********************************************************************/ 
  42. void FindStackDirection(void) 
  43.     char  iStackAddr            = 0;            // 用于获取栈地址 
  44.     static char *pStackAddr = NULL;     // 用于存放***个iStackAddr的地址  
  45.  
  46.     if (pStackAddr == NULL)               // ***次进入 
  47.     {                           
  48.         pStackAddr = &iStackAddr;        // 保存iStackAddr的地址 
  49.         FindStackDirection();                 // 递归  
  50.     } 
  51.     else                                 // 第二次进入  
  52.     {   
  53.         if (&iStackAddr > pStackAddr)        // 第二次iStackDirection的地址大于***次iStackDirection, 那么说明栈增长方向是向上的 
  54.         {    
  55.             printf("Stack grows up!\n"); 
  56.         } 
  57.         else if (&iStackAddr < pStackAddr)   // 第二次iStackDirection的地址小于***次iStackDirection, 那么说明栈增长方向是向下的 
  58.         {   
  59.             printf("Stack grows down!\n"); 
  60.         } 
  61.         else 
  62.         { 
  63.             printf("Bad stack!\n"); 
  64.         } 
  65.     } 

我们可以看到,函数FindStackDirection中出现了递归调用,即***进入该函数的时候,将iStackAddr变量(局部变量)的地址值赋给pStackAddr,第二次进入该函数的时候,用新的iStackAddr变量的地址值与***次进入该函数时iStackAddr变量的地址值相比较,如果前者大于后者,那么说明栈增长方向是向上的,否则,说明栈增长方向是向下的。

将以上代码上传到Linux机器上,使用“gcc -g -o FindStackDirection FindStackDirection.c”命令对程序进行编译之后,运行“FindStackDirection”命令,结果如下:

 
 
 
 
  1. Stack grows down! 

即我所使用的系统中的栈的增长方向是向下的。大家也可以将以上代码在自己的系统中运行一下,看看结果是什么。

在大部分人(包括我)的印象中,栈的增长方向只有一种,那就是向上(如图1中的(a)),但程序运行出来的结果与我们预期的恰恰相反。从这点也可以看出计算机系统在设计上的精妙与复杂,里面有很多东西都值得我们细细研究的。

【本文是专栏作者周兆熊的原创文章,作者微信公众号:周氏逻辑(logiczhou)】

戳这里,看该作者更多好文

文章名称:一个有趣的计算机系统问题---判断栈的增长方向
当前路径:http://www.shufengxianlan.com/qtweb/news36/512786.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联