日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
一個有趣的計算機系統(tǒng)問題---判斷棧的增長方向

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

樅陽網(wǎng)站建設公司成都創(chuàng)新互聯(lián),樅陽網(wǎng)站設計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為樅陽成百上千家提供企業(yè)網(wǎng)站建設服務。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設公司要多少錢,請找那個售后服務好的樅陽做網(wǎng)站的公司定做!

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

圖1 棧的兩種增長方向

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

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

 
 
 
 
  1. /********************************************************************** 
  2. * 版權所有 (C)2017, Zhou Zhaoxiong。 
  3. * 文件名稱:FindStackDirection.c 
  4. * 文件標識:無 
  5. * 內(nèi)容摘要:判斷棧的增長方向 
  6. * 其它說明:無 
  7. * 當前版本:V1.0 
  8. * 作    者:Zhou Zhaoxiong 
  9. * 完成日期:20170630 
  10. **********************************************************************/ 
  11. #include  
  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)了遞歸調用,即***進入該函數(shù)的時候,將iStackAddr變量(局部變量)的地址值賦給pStackAddr,第二次進入該函數(shù)的時候,用新的iStackAddr變量的地址值與***次進入該函數(shù)時iStackAddr變量的地址值相比較,如果前者大于后者,那么說明棧增長方向是向上的,否則,說明棧增長方向是向下的。

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

 
 
 
 
  1. Stack grows down! 

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

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

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

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


網(wǎng)頁名稱:一個有趣的計算機系統(tǒng)問題---判斷棧的增長方向
網(wǎng)頁URL:http://www.dlmjj.cn/article/cdpgedj.html