c語言函數(shù)是壓棧,c語言函數(shù)是壓棧嗎

C語言中函數(shù)參數(shù)壓棧方式為什么是從右到左

棧是先入后出的數(shù)據(jù)結(jié)構.

渭城網(wǎng)站建設公司成都創(chuàng)新互聯(lián)公司,渭城網(wǎng)站設計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為渭城上千家提供企業(yè)網(wǎng)站建設服務。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站制作要多少錢,請找那個售后服務好的渭城做網(wǎng)站的公司定做!

函數(shù)參數(shù)從右到左, 那么到函數(shù)內(nèi)部出棧的時候就是從左到右的順序了.

對于普通函數(shù)無區(qū)別. 但對于可變參函數(shù), 會根據(jù)左側(cè)參數(shù)來決定共計有多少參數(shù), 每個類型是什么.

比如 printf scanf這類的.

于是 就設計成從右到左的壓棧方式了.

C語言中函數(shù)參數(shù)壓棧方式為什么是從右到左的

因為有些是不定參數(shù)的

這樣函數(shù)內(nèi) 在處理的時候 從左到右 會更方便。

根據(jù)前面的參數(shù) 來確定后面還有多少參數(shù) 這樣。

要函數(shù)內(nèi)部彈棧從左到右

那么壓棧就只能從右到左了。

關于c語言 壓棧函數(shù)

方法很簡單:你講兩個棧都傳進去,類似于 : int pus(SeqStack1 *s, DataType* x1, SeqStack2 *s, DataType* x2)(SeqStack1是你的第一個棧,SeqStack2是第二個棧,DataType是你需要傳進去的數(shù)據(jù)的類型),然后在這個函數(shù)里面先判斷x1 ,x2是否為空,如果為空,則他對應的那個棧不需要壓棧,如果不為空,則執(zhí)行相應的壓棧操作。

不明白繼續(xù)追問!

C語言printf函數(shù)壓棧問題

i++是后+1,++i是先+1,多個參數(shù)的壓棧順序是從最后一個開始的因此,

上邊輸出的結(jié)果是第一行先++i,輸出就是2,后邊是I++,因此還是2;

第二行,先是i++,輸出就是1,之后++i,輸出就是2;

第三行,先是i++,輸出就是1,之后還是i++,輸出還是1,

但是本次取數(shù)完畢后,i已經(jīng)經(jīng)歷了2次+1變成了3了,因此第四行輸出的就是3

C語言函數(shù)壓棧順序

基本正確,補充一點,參數(shù)一般是往寄存器里面放,放不下的情況下,才壓棧。

什么是堆和棧?函數(shù)壓棧是怎么回事?

什么是堆和棧?

一個由c/C++編譯的程序占用的內(nèi)存分為以下幾個部分

1、棧區(qū)(stack)— 由編譯器自動分配釋放 ,存放函數(shù)的參數(shù)值,局部變量的值等。其操作方式類似于數(shù)據(jù)結(jié)構中的棧。

2、堆區(qū)(heap) — 一般由程序員分配釋放, 若程序員不釋放,程序結(jié)束時可能由OS回收 。注意它與數(shù)據(jù)結(jié)構中的堆是兩回事,分配方式倒是類似于鏈表,呵呵。

3、全局區(qū)(靜態(tài)區(qū))(static)—,全局變量和靜態(tài)變量的存儲是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域, 未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域。 - 程序結(jié)束后有系統(tǒng)釋放

4、文字常量區(qū) —常量字符串就是放在這里的。 程序結(jié)束后由系統(tǒng)釋放

5、程序代碼區(qū)—存放函數(shù)體的二進制代碼。

函數(shù)壓棧是怎么回事?

函數(shù)壓棧的本質(zhì)是參數(shù)傳遞

這又跟匯編語言連系起來了.匯編語言的過程即proc可以理解成函數(shù)

比如一個最簡單的計算兩數(shù)之和函數(shù)

如果用匯編來寫估計是這樣的

sub proc

pop ax ;從stack取a 并放在AX寄存器中

pop bx ;從stack取b 并放在BX寄存器中

add ax,bx ; 計算a+b

ret //返回

sub endp

顯然要調(diào)用這個函數(shù),你應當先把b值push進stack,然后再push a

因為stack是先進后出的

所以調(diào)用匯編像這樣

比如計算4+5

push 5;

push 4;

call sub; //返回值在AX中

在這個例子中先壓5或先壓4得到的結(jié)果沒有變化

但大多數(shù)程序,如果參數(shù)的順序錯誤將是災難性的

因為不管什么高級語言最終都要編譯成匯編語言,然后是機器語言

同樣下面這個C程序,計算a+b值,必然會編譯成上面的匯編代碼

int sub(int a ,int b) {return a+b;}

所以C在調(diào)用這個函數(shù)sub時,必須要壓棧(即傳入?yún)?shù))但這些工作,在C語言里,并不需要你來完成.你只要寫出

sub(7,9);

編譯器在編譯成匯編時就會自動完成相關的壓棧工作.

根據(jù)函數(shù)調(diào)用方式和參數(shù)壓入順序目前存在三種約定:

stdcall

cdecl

fastcall

這都相關壓棧順序和棧的清理工作約定

他們的細節(jié)都不相同,但有一點是肯定的,參數(shù)比須從右向左壓入棧中

stdcall中 函數(shù)必須自已清理棧

cdecall 由調(diào)用者清除堆棧 C的默認函數(shù)調(diào)用方式 所以這樣C支持可變參數(shù)

fastcall 是把函數(shù)參數(shù)列表的前三個參數(shù)放入寄存器eax,edx,ecx,其他參數(shù)壓棧

源代碼:

int function(int a, int b)

{

return a + b;

}

void main()

{

function(10, 20);

}

1.__cdecl

_function

push ebp

mov ebp, esp

mov eax, [ebp+8] ;參數(shù)1

add eax, [ebp+C] ;加上參數(shù)2

pop ebp

retn

_main

push ebp

mov ebp, esp

push 14h ;參數(shù) 2入棧

push 0Ah ;參數(shù) 1入棧

call _function ;調(diào)用函數(shù)

add esp, 8 ;修正棧

xor eax, eax

pop ebp

retn

2.__fastcall

@function@8

push ebp

mov ebp, esp ;保存棧指針

sub esp, 8 ;多了兩個局部變量

mov [ebp-8], edx ;保存參數(shù) 2

mov [ebp-4], ecx ;保存參數(shù) 1

mov eax, [ebp-4] ;參數(shù) 1

add eax, [ebp-8] ;加上參數(shù) 2

mov esp, ebp ;修正棧

pop ebp

retn

_main

push ebp

mov ebp, esp

mov edx, 14h ;參數(shù) 2給EDX

mov ecx, 0Ah ;參數(shù) 1給ECX

call @function@8 ;調(diào)用函數(shù)

xor eax, eax

pop ebp

retn

3.__stdcall

_function@8

push ebp

mov ebp, esp

mov eax, [ebp] ;參數(shù) 1

add eax, [ebp+C] ;加上參數(shù) 2

pop ebp

retn 8 ;修復棧

_main

push ebp

mov ebp, esp

push 14h ;參數(shù) 2入棧

push 0Ah ;參數(shù) 1入棧

call _function@8 ;函數(shù)調(diào)用

xor eax, eax

pop ebp

retn

文章題目:c語言函數(shù)是壓棧,c語言函數(shù)是壓棧嗎
網(wǎng)站網(wǎng)址:http://muchs.cn/article10/hcgigo.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)、Google、App開發(fā)網(wǎng)站設計公司、微信小程序、云服務器

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站