程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 查找棧的增長方向的分析及C代碼實現

查找棧的增長方向的分析及C代碼實現

編輯:關於C語言

查找棧的增長方向的分析及C代碼實現


對於棧這種數據結構,大家應該不會陌生,它是一種後進先出的數據結構。在一般的計算機系統中,棧存在著兩種存放數據的方式,一種是向上增長的,一種是向下增長的,如圖1所示。
這裡寫圖片描述vc/yPC9wPg0KPHA+1NrNvDG1xChhKdbQo6zVu8rHz/LJz9T2s6S1xKOsvLTK/b7dQbbU06a1xLXY1rfQodPayv2+3UK21NOmtcS12Na3o7vU2s28MbXEKGIp1tCjrNW7ysfP8s/C1PazpLXEo6y8tMr9vt1BttTTprXEtdjWt7Tz09rK/b7dQrbU06a1xLXY1rehozwvcD4NCjxwPsTHw7SjrM7Sw8fU9dH5wLSy6b+0KNfuusPTw7PM0PIp19S8usv5yrnTw7XEz7XNs9bQtcTVu7XE1PazpLe9z/K1vbXXyvTT2sTE0rvW1sTYo78o16KjutXiysfO0sW8yLvU2s34yc+/tLW9tcTSu7j2zsrM4qGjKTwvcD4NCjxwPs7Sw8fWqrXAo6zX986q0rvW1rOj08O1xMr9vt294bm5o6zVu9b30qrTw9PatOa3xbPM0PLW0LXEvtayv7Hkwb+6zbqvyv21xMrkyOuyzsr9oaPEx8O0o6zO0sPHvs2/ydLUyei8xtK7uPazzNDyo6zU2rPM0PLW0M2ouf2xyL3PxLPSu7j2vtayv7Hkwb+1xMewuvPBvbTOtcS12Na31rXAtMXQts/Vu7XE1PazpLe9z/Kho8D708PV4rj2z+u3qLHg0LSz9sC0tcSzzNDyyOfPwsv5yr6jujwvcD4NCjxwcmUgY2xhc3M9"brush:java;"> /********************************************************************** * 版權所有 (C)2015, Zhou Zhaoxiong。 * * 文件名稱:FindStackDirection.c * 文件標識:無 * 內容摘要:查看棧的增長方向 * 其它說明:無 * 當前版本:V1.0 * 作 者:Zhou Zhaoxiong * 完成日期:20151202 * **********************************************************************/ #include // 重定義數據類型 typedef unsigned char UINT8; typedef signed int INT32; // 函數聲明 void FindStackDirection(void); /********************************************************************** * 功能描述:主函數 * 輸入參數:無 * 輸出參數:無 * 返 回 值:無 * 其它說明:無 * 修改日期 版本號 修改人 修改內容 * --------------------------------------------------------------- * 20151202 V1.0 Zhou Zhaoxiong 創建 ***********************************************************************/ INT32 main() { FindStackDirection(); return 0; } /********************************************************************** * 功能描述:查找棧增長方向 * 輸入參數:無 * 輸出參數:無 * 返 回 值:無 * 其它說明:無 * 修改日期 版本號 修改人 修改內容 * --------------------------------------------------------------- * 20151202 V1.0 Zhou Zhaoxiong 創建 ***********************************************************************/ void FindStackDirection(void) { UINT8 iStackAddr = 0; // 用於獲取棧地址 static UINT8 *pStackAddr = NULL; // 用於存放第一個iStackAddr的地址 if (pStackAddr == NULL) // 第一次進入 { pStackAddr = &iStackAddr; // 保存iStackAddr的地址 FindStackDirection(); // 遞歸 } else // 第二次進入 { if (&iStackAddr > pStackAddr) // 第二次iStackDirection的地址大於第一次iStackDirection, 那麼說明棧增長方向是向上的 { printf(Stack grows up! ); } else if (&iStackAddr < pStackAddr) // 第二次iStackDirection的地址小於第一次iStackDirection, 那麼說明棧增長方向是向下的 { printf(Stack grows down! ); } else { printf(Bad stack! ); } } }

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

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

Stack grows down!

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

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

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved