<stdarg.h>)va_list ap;:參數列表游標。va_start(ap, last_fixed_param);:初始化,從最後一個固定參數開始。va_arg(ap, type);:提取下一個參數,**必須知道型別**。va_end(ap);:清理 (某些平台需釋放棧空間)。#includedouble average(int count, ...) { va_list ap; va_start(ap, count); double sum = 0; for (int i = 0; i < count; i++) sum += va_arg(ap, int); // 假設皆為 int va_end(ap); return sum / count; } int main() { printf("%.2f\n", average(6, 1,2,3,4,5,6)); // 3.50 return 0; }
void nstrcat(char *dest, ...) {
va_list ap;
va_start(ap, dest);
const char *s;
while ((s = va_arg(ap, const char *)) != NULL) { // 以 NULL 結束
while (*dest) dest++; // 移到末尾
while ((*dest++ = *s++)); // 複製含 \0
dest--; // 退回 \0 位置,供下一輪接續
}
va_end(ap);
}
int main() {
char buf[100] = "";
nstrcat(buf, "Hello", " ", "World", "!", NULL);
puts(buf); // Hello World!
return 0;
}
va_arg(ap, int) 傳 double → UB。float → double,char/short → int。提取時用提升後型別。va_copy:複製 va_list 供二次遍歷。解析格式字串 %d %s %f 決定 va_arg 型別與次數,這是可變參數的標準用法模式。