偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

一個有趣的計算機系統(tǒng)問題---判斷棧的增長方向

開發(fā) 開發(fā)工具
本文將講解一個有趣的計算機系統(tǒng)問題---判斷棧的增長方向。

最近,我在某技術(shù)論壇上看到一個有趣的問題:如何判斷計算機系統(tǒng)中棧的增長方向?

首先讓我簡單介紹一下這個問題的背景。對于棧這種數(shù)據(jù)結(jié)構(gòu),大家應(yīng)該不會陌生,它是一種后進先出的數(shù)據(jù)結(jié)構(gòu)。據(jù)說,在一般的計算機系統(tǒng)中,棧存在著兩種存放數(shù)據(jù)的方式,一種是向上增長的,一種是向下增長的,如圖1所示。

棧的兩種增長方向

圖1 棧的兩種增長方向

在圖1的(a)中,棧是向上增長的,即數(shù)據(jù)A對應(yīng)的地址小于數(shù)據(jù)B對應(yīng)的地址;在圖1的(b)中,棧是向下增長的,即數(shù)據(jù)A對應(yīng)的地址大于數(shù)據(jù)B對應(yīng)的地址。那么,我們怎樣來判斷自己所使用的系統(tǒng)中的棧的增長方向到底屬于哪一種呢?

我們知道,作為一種常用的數(shù)據(jù)結(jié)構(gòu),棧主要用于存放程序中的局部變量和函數(shù)的輸入?yún)?shù)。那么,我們就可以設(shè)計一個程序,在程序中通過比較某一個局部變量的前后兩次的地址值來判斷棧的增長方向。利用這個想法編寫出來的程序如下所示:

  1. /********************************************************************** 
  2. * 版權(quán)所有 (C)2017, Zhou Zhaoxiong。 
  3. * 文件名稱:FindStackDirection.c 
  4. * 文件標識:無 
  5. * 內(nèi)容摘要:判斷棧的增長方向 
  6. * 其它說明:無 
  7. * 當前版本:V1.0 
  8. * 作    者:Zhou Zhaoxiong 
  9. * 完成日期:20170630 
  10. **********************************************************************/ 
  11. #include <stdio.h> 
  12.  
  13. // 函數(shù)聲明 
  14. void FindStackDirection(void); 
  15.  
  16. /********************************************************************** 
  17. * 功能描述:主函數(shù) 
  18. * 輸入?yún)?shù):無 
  19. * 輸出參數(shù):無 
  20. * 返 回 值:無 
  21. * 其它說明:無 
  22. * 修改日期           版本號      修改人                  修改內(nèi)容 
  23. * --------------------------------------------------------------------------- 
  24. * 20170630         V1.0     Zhou Zhaoxiong          創(chuàng)建 
  25. ***********************************************************************/ 
  26. int main() 
  27.     FindStackDirection(); 
  28.  
  29.     return 0;  
  30.  
  31.  
  32. /********************************************************************** 
  33. * 功能描述:查找棧增長方向 
  34. * 輸入?yún)?shù):無 
  35. * 輸出參數(shù):無 
  36. * 返 回 值:無 
  37. * 其它說明:無 
  38. * 修改日期         版本號          修改人              修改內(nèi)容 
  39. * -------------------------------------------------------------------------------- 
  40. * 20170630        V1.0     Zhou Zhaoxiong          創(chuàng)建 
  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.     } 

我們可以看到,函數(shù)FindStackDirection中出現(xiàn)了遞歸調(diào)用,即***進入該函數(shù)的時候,將iStackAddr變量(局部變量)的地址值賦給pStackAddr,第二次進入該函數(shù)的時候,用新的iStackAddr變量的地址值與***次進入該函數(shù)時iStackAddr變量的地址值相比較,如果前者大于后者,那么說明棧增長方向是向上的,否則,說明棧增長方向是向下的。

將以上代碼上傳到Linux機器上,使用“gcc -g -o FindStackDirection FindStackDirection.c”命令對程序進行編譯之后,運行“FindStackDirection”命令,結(jié)果如下:

  1. Stack grows down! 

即我所使用的系統(tǒng)中的棧的增長方向是向下的。大家也可以將以上代碼在自己的系統(tǒng)中運行一下,看看結(jié)果是什么。

在大部分人(包括我)的印象中,棧的增長方向只有一種,那就是向上(如圖1中的(a)),但程序運行出來的結(jié)果與我們預(yù)期的恰恰相反。從這點也可以看出計算機系統(tǒng)在設(shè)計上的精妙與復(fù)雜,里面有很多東西都值得我們細細研究的。

【本文是51CTO專欄作者周兆熊的原創(chuàng)文章,作者微信公眾號:周氏邏輯(logiczhou)】

戳這里,看該作者更多好文

責任編輯:趙寧寧 來源: 51CTO專欄
相關(guān)推薦

2014-04-10 09:40:51

System 360計算機計算機系統(tǒng)

2018-07-05 09:25:07

系統(tǒng)存儲層次

2022-03-30 15:25:28

鏈接過程計算機系統(tǒng)程序

2019-01-14 11:10:43

機器學習人工智能計算機

2010-08-18 08:53:53

Scala

2009-01-05 13:07:54

軟件設(shè)計師計算機系統(tǒng)

2016-05-09 10:46:27

2015-12-11 10:02:51

2011-07-25 13:34:08

ORACLEFLASHBACK T

2012-09-12 09:59:26

云計算超級計算機數(shù)據(jù)中心

2020-09-17 10:25:36

計算機系統(tǒng) 技術(shù)

2009-07-04 09:38:07

2009-10-21 13:27:32

2009-04-17 15:30:22

2020-07-22 14:45:20

2010-04-02 09:42:24

2011-05-19 09:39:51

數(shù)據(jù)庫計算機

2009-02-10 09:32:01

2009-01-05 13:23:25

軟件設(shè)計師筆記

2022-12-13 16:29:11

戴爾
點贊
收藏

51CTO技術(shù)棧公眾號