C語言中定義了va_list, va_start( ), va_arg( ), va_end( ) 這樣一組宏來處理可變參數(shù)問題。可以參考printf的聲明,創(chuàng)建自己的實(shí)現(xiàn)函數(shù)。

成都創(chuàng)新互聯(lián)公司長期為成百上千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為富源企業(yè)提供專業(yè)的網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè),富源網(wǎng)站改版等技術(shù)服務(wù)。擁有10多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
VA_LIST是在C語言中解決變參問題的一組宏,所在頭文件:#include stdarg.h,用于獲取不確定個數(shù)的參數(shù)。
首先先看到main函數(shù)中的不定參數(shù):引用:在Turbo C0啟動過程中, 傳遞main()函數(shù)三個參數(shù): argc, argv和env。argc: 整數(shù), 鴐ain()的命令行參數(shù)個數(shù)。argv: 字符串?dāng)?shù)組。
C語言可以用不定參數(shù)來實(shí)現(xiàn):這里使用了第一個參數(shù)來表達(dá)具體數(shù)字的個數(shù),可以避免一些內(nèi)部實(shí)現(xiàn)的麻煩,add函數(shù)的預(yù)期也比較明確。
很巧我現(xiàn)在正好也有實(shí)現(xiàn)這樣函數(shù)的需求,其實(shí)就是看了C語言可變參數(shù)函數(shù)的相關(guān)資料,你就差不多知道怎么實(shí)現(xiàn)了。只不過其中有一個很重要的大坑,只要邁過去就沒問題。
1、分析:你在args函數(shù)中對不定參進(jìn)行遍歷,但要求最后是0時跳出循環(huán),顯然main中的數(shù)據(jù)不符合要求,導(dǎo)致遍歷溢出,結(jié)果難以預(yù)測。
2、宏很難實(shí)現(xiàn)變長參數(shù),不過c提供了函數(shù)來處理,在c中printf,scanf等函數(shù)就是處理變長參數(shù)列表的。
3、如果參數(shù)是char或float類型,這樣的參數(shù)放在可變參數(shù)部分的話,編譯器是會默認(rèn)把它們的類型提升為相應(yīng)的“全”類型的:char提升為int,float提升為double。如果你沒注意這一點(diǎn)就會出現(xiàn)錯誤。當(dāng)然可以通過指針的類型轉(zhuǎn)換來避免。
4、參數(shù)是存放在內(nèi)存的堆棧里的。如果所傳的參數(shù)長度超出了分配的內(nèi)存的長度,內(nèi)存里會出現(xiàn)不可預(yù)期的內(nèi)容。所以這樣做是很有危險(xiǎn)的,黑客總是善于利用這樣的漏洞。
5、在C語言中,如果把數(shù)組作為一個函數(shù)的參數(shù)的話,在對函數(shù)進(jìn)行傳值的時候只是把數(shù)組的首地址傳過去,也就是指針傳過去,所以再用sizeof(array)/sizeof(int)求數(shù)組的大小只能得到1。
分析:你在args函數(shù)中對不定參進(jìn)行遍歷,但要求最后是0時跳出循環(huán),顯然main中的數(shù)據(jù)不符合要求,導(dǎo)致遍歷溢出,結(jié)果難以預(yù)測。
宏很難實(shí)現(xiàn)變長參數(shù),不過c提供了函數(shù)來處理,在c中printf,scanf等函數(shù)就是處理變長參數(shù)列表的。
C語言中定義了va_list, va_start( ), va_arg( ), va_end( ) 這樣一組宏來處理可變參數(shù)問題。可以參考printf的聲明,創(chuàng)建自己的實(shí)現(xiàn)函數(shù)。
本文名稱:c語言中的不定參數(shù)函數(shù) c語言不定參數(shù)的函數(shù)如何定義
網(wǎng)站路徑:http://chinadenli.net/article46/dshgghg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)、網(wǎng)站制作、網(wǎng)站內(nèi)鏈、云服務(wù)器、網(wǎng)站收錄、網(wǎng)頁設(shè)計(jì)公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)