In a C variadic function, if va_start() has been called on a va_list, is it required to call va_end() before the function returns?

Difficulty: Easy

Correct Answer: Yes

Explanation:


Introduction / Context:
va_end is the counterpart to va_start in C’s stdarg.h. Although on some implementations va_end may appear to do nothing, the C standard requires its use to allow the implementation to perform any necessary cleanup or state reset for the va_list.



Given Data / Assumptions:

  • va_list ap has been initialized by va_start.
  • The function will return normally or via a branch.


Concept / Approach:
Once you call va_start, the program has entered a region where the runtime may have reserved resources or needs to restore internal state. Calling va_end signals that iteration is finished. This is required even if you ended up reading zero variadic arguments after initialization.



Step-by-Step Solution:
va_list ap; va_start(ap, last_named_param);// zero or more calls to va_arg(ap, type)va_end(ap); // always before return



Verification / Alternative check:
Inspect the standard library’s v* functions or compiler documentation—each stresses the contract: every va_start must be paired with a va_end, similar to resource acquisition/cleanup patterns.



Why Other Options Are Wrong:
Conditioning va_end on platform, number of arguments, or types is incorrect. The rule is unconditional in portable C code.



Common Pitfalls:
Returning early without calling va_end on all paths; using va_list after va_end, which is undefined behavior.



Final Answer:
Yes

Discussion & Comments

No comments yet. Be the first to comment!
Join Discussion