C varargs API usage: identify the error when va_list is used without calling va_start in a variable-argument function.
#include
#include
void varfun(int n, ...);
int main()
{
varfun(3, 7, -11, 0);
return 0;
}
void varfun(int n, ...)
{
va_list ptr;
int num;
num = va_arg(ptr, int); /* va_start not called */
printf("%d", num);
}
-
AError: ptr has to be set at begining
-
BError: ptr must be type of va_list
-
CError: invalid access to list member
-
DNo error
-
ENone of the above
Answer
Correct Answer: Error: ptr has to be set at begining
Explanation
Introduction / Context:Correct sequencing of varargs macros is crucial. The lifetime of a va_list begins with va_start, continues through one or more va_arg calls, and ends with va_end. Skipping va_start results in undefined behavior when attempting to read arguments.
Given Data / Assumptions:
- Function signature:
void varfun(int n, ...). va_list ptr;declared but not initialized.va_arg(ptr, int)is called immediately.
Concept / Approach:va_start(ptr, n) initializes ptr so it points just past the last fixed parameter n. Only after this initialization may the code legally use va_arg to read each successive argument. Without initialization, ptr has an indeterminate value, and dereferencing it via va_arg is undefined.
Step-by-Step Solution:Add va_start(ptr, n); before the first va_arg.Use num = va_arg(ptr, int); to fetch the first promoted integer.After finishing, call va_end(ptr); to clean up.
Verification / Alternative check:Compilers with warnings enabled often flag missing va_start. Runtime sanitizers may catch crashes or misreads that arise from uninitialized va_list.
Why Other Options Are Wrong:ptr must be type of va_list — it already is. invalid access to list member is vague; the concrete root cause is the missing initialization. No error is incorrect, as behavior is undefined.
Common Pitfalls:Forgetting va_end after finishing, and mixing types without a controlling count or format descriptor.
Final Answer:Error: ptr has to be set at begining