棧是後進先出(LIFO)的數據結構,在計算機系統中分為「向上增長」和「向下增長」兩種架構。本文通過遞歸函數比較局部變量地址,實現運行時檢測當前系統棧增長方向。
利用遞歸調用在棧上創建兩幀,比較同名局部變量在兩幀中的地址:
addr 的地址到靜態指針 paddr 地址與 p 比較
&addr > p → 棧向上增長&addr < p → 棧向下增長/********************************************************************** * 文件名:FindStackDirection.c * 功能:檢測棧增長方向 * 作者:Zhou Zhaoxiong **********************************************************************/ #includetypedef unsigned char UINT8; typedef signed int INT32; void FindStackDirection(void); INT32 main() { FindStackDirection(); return 0; } void FindStackDirection(void) { UINT8 addr = 0; // 局部變量,每次遞歸分配新棧幀 static UINT8 *p = NULL; // 靜態指針,保存第一幀地址 if (p == NULL) { // 第一次進入 p = &addr; // 保存首幀地址 FindStackDirection(); // 遞歸進入第二幀 } else { // 第二次進入 if (&addr > p) { printf("Stack grows up!\n"); } else if (&addr < p) { printf("Stack grows down!\n"); } else { printf("Bad stack!\n"); } } }
# Linux/GCC 編譯 gcc -g -o FindStackDirection FindStackDirection.c # 運行 ./FindStackDirection # 輸出:Stack grows down!
主流系統(Linux/Windows/macOS 在 x86/x64 上)均輸出 Stack grows down!,證實棧向低地址方向增長。
通過簡單的遞歸地址比較,即可在運行時確定棧增長方向。這不僅是經典面試題,更揭示了計算機系統底層內存佈局的基本規律。理解棧增長方向對調試棧溢出、編寫 Shellcode、逆向分析、嵌入式開發均有重要指導意義。