棧增長方向與大端 小端問題

2021-06-23 07:33:38 字數 1374 閱讀 6528

棧增長和大端/小端問題是和cpu相關的兩個問題。

在記憶體管理中,與棧對應是堆。對於堆來講,生長方向是向上的,也就是向著記憶體位址增加的方向;對於棧來講,它的生長方式是向下的,是向著記憶體位址減小的方向增長。在記憶體中,「堆」和「棧」共用全部的自由空間,只不過各自的起始位址和增長方向不同,它們之間並沒有乙個固定的界限,如果在執行時,「堆」和 「棧」增長到發生了相互覆蓋時,稱為「棧堆衝突」,系統肯定垮台。

在常見的x86中記憶體中棧的增長方向就是從高位址向低位址增長。

我們可以通過一些**來判斷棧的增長方向:

#include

static

int stack_dir;  

static

void find_stack_direction (

void)    

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函式使用函式遞迴的方法

第一次進入,由於addr為null,所以將字元變數dummy的位址賦值給靜態變數addr

第二次進入,由於靜態變數addr已賦了值,所以進入 "second entry."

接著,將第二次進入的dummy位址和第一次進入的dummy位址相比較

如果值為正,則堆疊向高位址增長;否則,堆疊向低位址增長

大端/小端就是big-endian/little-endian問題

有兩種常見的方法來判斷是大端還是小端

方法一:使用指標

int x=1;

if(*(char*)&x==1)

printf("little-endian\n");

else

printf("big-endian\n");

方法二:使用聯合

unionx;

x.i=1;

if(x.c==1)

printf("little-endian\n");

else

printf("big-endian\n");

下面是乙個圖示:

下面的**是實現大端和小端整數的轉換:

int chgendian(int x)

return x2; }



棧增長方向與大端 小端問題

棧增長和大端 小端問題是和cpu相關的兩個問題。在記憶體管理中,與棧對應是堆。對於堆來講,生長方向是向上的,也就是向著記憶體位址增加的方向 對於棧來講,它的生長方式是向下的,是向著記憶體位址減小的方向增長。在記憶體中,堆 和 棧 共用全部的自由空間,只不過各自的起始位址和增長方向不同,它們之間並沒有...

棧增長方向與大端 小端問題

棧增長和大端 小端問題是和cpu相關的兩個問題。在記憶體管理中,與棧對應是堆。對於堆來講,生長方向是向上的,也就是向著記憶體位址增加的方向 對於棧來講,它的生長方式是向下的,是向著記憶體位址減小的方向增長。在記憶體中,堆 和 棧 共用全部的自由空間,只不過各自的起始位址和增長方向不同,它們之間並沒有...

棧的增長方向

如何判斷棧的增長方向?對於乙個用慣了i386系列機器的人來說,這似乎是乙個無聊的問題,因為棧就是從高位址向低位址增長。不過,顯然這不是這個問題的目的,既然把這個問題拿出來,問的就不只是i386系列的機器,跨硬體平台是這個問題的首先要考慮到的因素。在乙個物質極大豐富的年代,除非無路可退,否則我們堅決不...