天天看點

stdarg.h頭檔案中va_start va_arg va_end解析

stdarg.h頭檔案中va_start va_arg va_end解析

stdarg.h是C語言中C标準函數庫的頭檔案,stdarg是由standard(标準) arguments(參數)簡化而來,主要目的為讓函數能夠接收可變參數。其中主要涉及到 va_start  va_arg  va_end這三個函數,下面将主要通過一個例子來介紹這三個函數的作用。 總結:讀取可變參數的過程其實就是在堆棧中,使用指針,周遊堆棧段中的參數清單,從低位址到高位址一個一個地把參數内容讀出來的過程·(因為入棧是從高位址向低位址入棧,出棧就從低位址向高位址出棧,先入後出)

例(例子來自stdarg.h的百度百科)紅色部分為自己了解内容 #include <stdio.h> #include <stdarg.h>

void printargs(int arg1, ...) //好多資料認為可變參數裡面必須為int型,個人認為是錯誤的 {   va_list ap; //va_list是一個數組/指針類型(參數清單),當該類型的對象作為參數傳遞時,它将被引用傳遞。   int i;   va_start(ap, arg1); //開始可變參數處理, 得到第一個可變參數位址/指針,好多資料認為這裡的arg1是可變參數的個數,個人認為是錯誤的   for (i = arg1; i != -1; i = va_arg(ap, int)) //得到第一個可變參數的值,執行後ap指向下一個可變參數位址即将ap指針上移(int)大小位址                                                               //注意:int i; i = va_arg(ap, int)  這裡i的類型需和va_arg函數裡面第二個參數的類型一緻   printf("%d ", i);   va_end(ap); //置空ap,即ap=(void *)0;即釋放連結清單   putchar('\n'); } int main(void) {   printargs(5, 2, 14, 84, 97, 15, 24, 48, -1);   printargs(84, 51, -1);   printargs(-1);   printargs(1, -1); return 0; } 這個程式産生輸出: 5 2 14 84 97 15 24 48 84 51 1