溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C語(yǔ)言函數(shù)參數(shù)壓棧的順序

發(fā)布時(shí)間:2021-08-24 18:09:35 來(lái)源:億速云 閱讀:222 作者:chen 欄目:互聯(lián)網(wǎng)科技

本篇內(nèi)容主要講解“C語(yǔ)言函數(shù)參數(shù)壓棧的順序”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“C語(yǔ)言函數(shù)參數(shù)壓棧的順序”吧!

今天分享關(guān)于C語(yǔ)言函數(shù)參數(shù)壓棧順序的問(wèn)題。按照日常習(xí)慣,C語(yǔ)言的函數(shù)參數(shù)壓棧順序是從左到右吧?但是事實(shí)卻是相反的,C語(yǔ)言函數(shù)參數(shù)壓棧順序是從右到左的。下面看一個(gè)程序:

#include <stdio.h>

void stack_test1(int a, int b, int c);

int main(void)
{
 int a = 1, b = 2, c = 3;
 
 stack_test1(a, b, c);
 
 return 0;
}

void stack_test1(int a, int b, int c)
{
 printf("a = %d, &a = %#x \n", a, (unsigned int)&a);
 printf("b = %d, &b = %#x \n", b, (unsigned int)&b);
 printf("c = %d, &c = %#x \n", c, (unsigned int)&c);
}

該程序輸出結(jié)果為:

a = 1, &a = 0x61fef0
b = 2, &b = 0x61fef4
c = 3, &c = 0x61fef8

我們知道,棧是向下生長(zhǎng)的,即從高地址向低地址的方向分配內(nèi)存。由程序輸出結(jié)果可知,變量c的值首先存儲(chǔ)在高地址,其次是b,最后低地址保存a。即函數(shù)的參數(shù)壓棧的順序是從右到左。

為什么是從右到左呢?下面使用printf函數(shù)來(lái)分析:

printf函數(shù)的原型是:int printf(const char *format,...);

我們都知道,printf是個(gè)變參函數(shù)。那么,其參數(shù)的個(gè)數(shù)是如何確定的呢,靠的就是format,如果format首先被壓入棧中,就無(wú)法知道還有多少個(gè)參數(shù)還沒(méi)入棧了;所以,format應(yīng)該最后入棧,才能確定參數(shù)的個(gè)數(shù),也即符合參數(shù)入棧順序?yàn)椤皬挠业阶蟆钡囊?guī)則。

到此,相信大家對(duì)“C語(yǔ)言函數(shù)參數(shù)壓棧的順序”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI