C語言可變長引數

2021-08-15 07:53:14 字數 972 閱讀 1808

在使用可變長引數時發現的乙個問題,首先先放一段**和它的執行結果:

產生這樣結果的原因就在於va_start的第二個引數不同:原先一直以為va_start的第二個引數是引數的個數,查了一些資料,找到va_start的定義後發現,va_start的第二個引數是可變長引數最左邊的位址。

va_start的定義如下:#define _crt_va_start(ap,v)  ( ap = (va_list)_addressof(v) + _intsizeof(v) )

#define va_start _crt_va_start

#define _crt_va_start(ap,v) ( ap = (va_list)_addressof(v) + _intsizeof(v) )

由此可以看出ap,也就是第乙個引數是乙個va_list型別的變數,它是乙個指標,指向v後面乙個變數的位址。

現在就可解釋之前**產生的結果了,第乙個va_start第二個引數是m,因此args指向的是n,輸出的依次是4,1,2,3

4是n的值,1,2,3是傳入的可變引數;第二個va_start的第二個引數是n,args指向的是n後的引數,也就是傳入的可變長引數的乙個值,所以輸出的就是1,2,3,4.

最後要注意的是千萬不要把va_start的第二個引數看成引數的個數,從而傳入乙個常量,程式一般會直接崩潰。

C 可變長引數

前面說到可變長引數 最後重要的是 第乙個引數為後面的引數的形式,format.i.e.printf 在這篇中想說的是不安全的問題 其實就是我瞎搞 先上 include include include void subfunc char format,va end ap return void fun...

可變長引數

由於在c語言中沒有函式過載,解決不定數目函式引數問題變得比較麻煩,即使採用c 如果引數個數不能確定,也很難採用函式過載。對這種情況,提出了指標引數來解決問題。如printf 函式,其原型為 int printf const char format,它除了有乙個引數format固定以外,後面跟的引數的...

可變長引數

可變長引數 指的是在呼叫函式時,傳入的引數個數可以不固定 呼叫函式時,傳值的方式無非兩種,一種是位置實參,另一種是關鍵字實參,因此形參也必須得有兩種解決方法,以此來分別接收溢位的位置實參 與關鍵字實參 形參中的會將溢位的位置實參全部接收,然後儲存元組的形式,然後把元組賦值給後的引數。需要注意的是 後...