Difficulty: Easy
Correct Answer: Correct
Explanation:
Introduction / Context:
Functions that accept a variable number of arguments (variadic functions) in C use facilities from stdarg.h: va_list, va_start, va_arg, and va_end. A common point of confusion is the exact role of va_arg in stepping through the unnamed arguments. This item checks whether you understand that va_arg both fetches the current argument and moves the internal pointer forward to the next one.
Given Data / Assumptions:
Concept / Approach:
After va_start initializes traversal, va_arg(list, type) is invoked repeatedly. For each call, C expects you to pass the promoted type that matches how the caller provided the argument. va_arg returns the value of the current argument and then advances the internal position in the va_list to point to the next argument. When you finish, you must call va_end to allow the implementation to clean up.
Step-by-Step Solution:
Declare va_list ap; then call va_start(ap, last_named_param).Call v1 = va_arg(ap, int); // extracts current promoted int and advances.Call v2 = va_arg(ap, double); // extracts next promoted double and advances again.After all arguments are consumed, call va_end(ap).
Verification / Alternative check:
Examine a typical printf-like loop that reads arguments until a format string is exhausted. Each va_arg corresponds to one conversion and automatically steps to the next parameter. If va_arg did not advance, the loop would return the same value repeatedly and never progress.
Why Other Options Are Wrong:
“Incorrect” ignores the specification that va_arg advances. “Only for the first variadic argument” is wrong because va_arg is used for each argument. “Works only with stdio.h” confuses library layers; stdarg.h is independent. “Not applicable in C” is false because stdarg.h is a core C feature.
Common Pitfalls:
Using the wrong type with va_arg (mismatch with promotions), forgetting va_end, or assuming va_arg peeks without advancing.
Final Answer:
Correct
Discussion & Comments