在C/C++中,對(duì)函數(shù)參數(shù)的掃描是從后向前的。C/C++的函數(shù)參數(shù)是通過(guò)壓入堆棧的方式來(lái)給函數(shù)傳參數(shù)的(堆棧是一種先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu)),最先壓入的參數(shù)最后出來(lái),在計(jì)算機(jī)的內(nèi)存中,數(shù)據(jù)有2塊,一塊是堆,一塊是棧(函數(shù)參數(shù)及局部變量在這里),而棧是從內(nèi)存的高地址向低地址生長(zhǎng)的,控制生長(zhǎng)的就是堆棧指針了,最先壓入的參數(shù)是在最上面,就是說(shuō)在所有參數(shù)的最后面,最后壓入的參數(shù)在最下面,結(jié)構(gòu)上看起來(lái)是第一個(gè),所以最后壓入的參數(shù)總是能夠被函數(shù)找到,因?yàn)樗驮诙褩V羔樀纳戏健rintf的第一個(gè)被找到的參數(shù)就是那個(gè)字符指針,就是被雙引號(hào)括起來(lái)的那一部分,函數(shù)通過(guò)判斷字符串里控制參數(shù)的個(gè)數(shù)來(lái)判斷參數(shù)個(gè)數(shù)及數(shù)據(jù)類(lèi)型,通過(guò)這些就可算出數(shù)據(jù)需要的堆棧指針的偏移量了,下面給出printf("%d,%d",a,b);(其中a、b都是int型的)的匯編代碼.

網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)建站!專(zhuān)注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、成都微信小程序、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶(hù)創(chuàng)新互聯(lián)還提供了成安免費(fèi)建站歡迎大家使用!
.section
.data
string out = "%d,%d"
push b //最后的先壓入棧中
push a //最先的后壓入棧中
push $out//參數(shù)控制的那個(gè)字符串常量是最后被壓入的
call printf
你會(huì)看到,參數(shù)是最后的先壓入棧中,最先的后壓入棧中,參數(shù)控制的那個(gè)字符串常量是最后被壓入的,所以這個(gè)常量總是能被找到的。
通常情況下函數(shù)可變參數(shù)表的長(zhǎng)度是已知的,通過(guò)num參數(shù)傳入,這種函數(shù)比較容易實(shí)現(xiàn)。
這是一個(gè)變參函數(shù)聲明。
加三個(gè)點(diǎn)就是了。
取得參數(shù)的套路是
這樣三步,就將 各個(gè)參數(shù),放在了 buf 中。
完整函數(shù)如下:
調(diào)用如下:
其中,vsprintf 可能造成內(nèi)存泄漏,因?yàn)閭魅氲?buf 的大小未知。
可換成
函數(shù)原型:
vsprintf 函數(shù)
vsnprintf 函數(shù)
變參函數(shù)的參數(shù)表通常為 (int n,..),其中,n是最后一個(gè)命名參數(shù),用來(lái)指出接下來(lái)要處理參數(shù)的個(gè)數(shù),這些參數(shù)的類(lèi)型是已知的,你要求區(qū)分字符串和字節(jié)流,該如何做呢?
分享標(biāo)題:變參函數(shù)C語(yǔ)言,c語(yǔ)言中函數(shù)的參數(shù)是什么變量
網(wǎng)站地址:http://chinadenli.net/article24/hsgcje.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、App設(shè)計(jì)、、網(wǎng)站排名、標(biāo)簽優(yōu)化、建站公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)