系統棧的增長方向判斷

2021-06-25 16:41:55 字數 1331 閱讀 8409

函式呼叫時引數入棧,因此可以定義兩個函式,分別輸出引數位址,以此來確定棧的生長方向。

[cpp]view plain

copy

print?

//確定棧的生長方向

//自定義函式fun1() 和fun2(),其中fun1()內部呼叫fun2(),輸出引數位址

#include

void

fun2(

intb)   

void

fun1(

inta)   

intmain( )   

result:

[plain]view plain

copy

print?

[scwangj@lb270107 cfd_******]$ gcc -o hello hello.c  

[scwangj@lb270107 cfd_******]$ ./hello  

fun1: 140735673261756  

fun2: 140735673261724  

[scwangj@lb270107 cfd_******]$   

上述程式中,首先fun1被呼叫,引數a入棧;在fun1函式內部,先輸出引數fun1函式的引數a的位址,然後呼叫fun2,fun2的引數b入棧;從結果來看,linux下棧的生長方向由高位址向低位址增長。

c在**會用到棧呢?稍微了解一點

等一下,怎麼比較兩個變數的位址呢?

「先宣告的先入棧

那就函式加個引數,比較引數和區域性變數的位置,引數肯定先入棧。那為什麼不能區域性變數先入棧?第一反應是怎麼可能,但仔細想來又沒有什麼不可以。所以,這種方法也依賴於編譯器的實現。

不妨回想一下,函式如何呼叫。執行乙個函式時,這個函式的相關資訊都會出現棧之中,比如引數、返回位址和區域性變數。當它呼叫另乙個函式時,在它棧資訊保持不變的情況下,會把它呼叫那個函式的資訊放到棧中。

比如,設計兩個函式,乙個作為呼叫方,另乙個作為被呼叫方。被呼叫方以乙個位址(也就是指標)作為自己的入口引數,呼叫方傳入的位址是自己的乙個區域性變數的位址,然後,被呼叫方比較這個位址和自己的乙個區域性變數位址,由此確定棧的增長方向。

好了,既然有了這個了解,顯然可以擴充套件一下前面的解決方案,可以兩個棧幀內任意的東西進行比較,比如,各自的入口引數,都可以確定棧的增長方向。

intfunc1();

intfunc()

intfunc1()

同學說過作業系統中「棧從上向下增長,堆從下向上增長;棧的位址減小,堆的位址增加」;在網上也看到過這樣的說法,現在驗證一下看來在windowxp和visual studio2008下是正確的。

判斷棧的增長方向

dreamhead老大曾經討論過這個問題,尋找一種可移植的方式來判斷棧的增長方向,見 棧的增長方向 今天在讀ruby hacking guide第5章,介紹alloca函式的部分,提到ruby實現的c語言版本的alloca.c,讀了下 發現這裡倒是實現了乙個很漂亮的函式用於 實現判斷棧的增長方向,利...

如何判斷棧的增長方向?

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

棧的增長方向

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