va_list הוא כביכול משתנה של הרשימה, המיועד להכיל את רשימץ הארגומנטים שהועברו לפונקציה.va_start מאתחלת את רשימת הארגומנטים המועברים לפונקציה לאיבר הראשון שהועבר במשתנה מסוג רשימה שכזאת. מה שקורה כאן בפועל, זה יצירת פוינטר מסוג האיבר הראשון שהועבר, ואיתחולו לכתובת של הארגומנט הראשון שהועבר...
va_arg מחזירה את הערך שמוצב בארגומנט הנוכחי שברשימה שהועברה, ומקדמת את הרשימה במספר בתים (לפי סוג המשתנים ברשימה). מה שקורה בפועל, זה החזרת הערך שבפוינטר שלעיל, וקידום הפוינטר באחד (++pointer).
va_end מאתחל את הרשימה, אתחול "ניקוי". מה שקורה בפועל, זה שחרור הזיכרון שהוקצה עבור הפוינטר הנ"ל.
יש לזכור כי שימוש בפונקציה מסוג זה, מהווה חור אבטחה (פירצה אפשרית) בתוכנית...כלומר יכול להיגרם Buffer-OverFlow (תוך מילוי המחסנית)...
Dudenland