这是下面知名链接中关于 va_arg
的说法:
http://www.cplusplus.com/reference/cstdarg/va_arg/
另请注意,va_arg 无法确定检索到的参数是否是传递给函数的最后一个参数(或者即使它是超出该列表末尾的元素)。该函数的设计方式应使参数的数量可以通过命名参数或已读取的附加参数的值以某种方式推断出来。
除此之外,在我阅读有关 va_arg
的马马虎虎的书中,所有示例都确保其中一个 fixed
参数始终是数字/我们将传递的可变参数的计数。这个计数用于将 va_arg
推进到下一个项目的循环,并且循环条件(使用计数)确保它在 va_arg
检索变量列表中的最后一个参数。这似乎证实了网站上的上述段落,其中说 “函数应该以这种方式设计......” (上图)
。
因此,直白地说,va_arg
有点笨。但是在以下取自该网站的 va_end
示例中,va_arg
突然似乎聪明地行动。当到达 char*
类型的变量参数列表的末尾时,它返回一个 NULL 指针。 怎么会这样?我链接的最上面的段落清楚地说明了
“va_arg 无法确定检索到的参数是否是传递给函数的最后一个参数(或者即使它是超出该列表末尾的元素”)
此外,以下程序中没有任何内容可确保在越过可变参数列表末尾时应返回 NULL 指针。那么 va_arg
为何会在此处返回 NULL 指针列表的末尾?
/* va_end example */
#include <stdio.h> /* puts */
#include <stdarg.h> /* va_list, va_start, va_arg, va_end */
void PrintLines (char* first, ...)
{
char* str;
va_list vl;
str=first;
va_start(vl,first);
do {
puts(str);
str=va_arg(vl,char*);
} while (str!=NULL);
va_end(vl);
}
int main ()
{
PrintLines ("First","Second","Third","Fourth",NULL);
return 0;
}
输出
First
Second
Third
Fourth
最佳答案
When the end of a variable argument list of type
char *
is reached, it returns aNULL
pointer. How is it so?
因为传递给函数的最后一个参数确实是NULL
:
PrintLines("First", "Second", "Third", "Fourth", NULL);
关于c - 为什么 va_arg 在 char* 类型的变量参数列表的末尾返回 NULL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16425007/