如何確定棧的增長方向地址是遞增還是遞減

#include<stdio.h>  
static int stack_dir;  
static void find_stack_direction (void)  {  
    static char   *addr = NULL;   /* address of first
                                     `dummy', once known */  
    char     dummy;          /* to get stack address */  

    if (addr == NULL)  
    {                           /* initial entry */  
        addr = &dummy;  

        find_stack_direction ();  /* recurse once */  
    }  
    else                          /* second entry */  
        if (&dummy > addr)  
            stack_dir = 1;            /* stack grew upward */  
        else  
            stack_dir = -1;           /* stack grew downward */  
}  

int main(void)  
{  
    find_stack_direction();  
    if(stack_dir==1)  
        puts("stack grew upward");  
    else  
        puts("stack grew downward");  
    return 0;  
} 

解釋:過程中使用了遞歸,在第一次addr指向的是dummy變量的地址,遞歸時,會將dummy壓棧,第二次的時候dummy的地址也會在棧裏面,這時候比較前後兩次壓棧的地址,就能夠知道棧中地址的增長方向是向上還是向下。

在內存管理中,與棧對應是堆。對於堆來講,生長方向是向上的,也就是向着內存地址增加的方向;對於棧來講,它的生長方式是向下的,是向着內存地址減小的方向增長。在內存中,“堆”和“棧”共用全部的自由空間,只不過各自的起始地址和增長方向不同,它們之間並沒有一個固定的界限,如果在運行時,“堆”和 “棧”增長到發生了相互覆蓋時,稱爲“棧堆衝突”,系統肯定垮臺。

發佈了77 篇原創文章 · 獲贊 23 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章