棧增長和大端/小端問題是和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系列的機器,跨硬體平台是這個問題的首先要考慮到的因素。在乙個物質極大豐富的年代,除非無路可退,否則我們堅決不...