为什么va_arg在char*类型的变量参数列表末尾返回NULL?

为什么va_arg在char*类型的变量参数列表末尾返回NULL?,c,null-pointer,variadic-functions,C,Null Pointer,Variadic Functions,这是关于va_arg的著名链接: 还要注意,va_arg既不确定检索到的参数是否是传递给函数的最后一个参数(也不确定它是否是超出该列表末尾的元素)。函数的设计应确保可以通过命名参数或已读取的附加参数的值以某种方式推断参数的数量。 除此之外,在我读到的关于va_arg的书中,所有示例都确保了fixed参数中的一个始终是我们要传递的变量参数的数量/计数。这个计数在循环中使用,该循环将va_arg推进到下一项,并循环条件(使用计数)确保它在va_arg检索变量列表中的最后一个参数时退出。这似乎证实了

这是关于
va_arg
的著名链接:

还要注意,va_arg既不确定检索到的参数是否是传递给函数的最后一个参数(也不确定它是否是超出该列表末尾的元素)。函数的设计应确保可以通过命名参数或已读取的附加参数的值以某种方式推断参数的数量。

除此之外,在我读到的关于
va_arg
的书中,所有示例都确保了
fixed
参数中的一个始终是我们要传递的变量参数的数量/计数。这个计数在循环中使用,该循环将
va_arg
推进到下一项,并循环条件(使用计数)确保它在
va_arg
检索变量列表中的最后一个参数时退出。这似乎证实了网站上的上述段落,该段落说
“函数应以这样的方式设计……”(见上文)

因此,直言不讳地说,
va_-arg
有点愚蠢。但是在该网站的
va_-end
的以下示例中,
va_-arg
突然似乎动作敏捷。当到达类型为
char*
的变量参数列表的末尾时,它返回一个空指针。这是怎么回事?最上面的第一段链接ed明确指出

“va_arg既不确定检索到的参数是否是传递给函数的最后一个参数(也不确定它是否是超出该列表末尾的元素”

此外,在下面的程序中没有任何东西可以确保在变量参数列表的末尾交叉时返回空指针。那么为什么
va_arg
会在列表的末尾返回空指针呢

/* 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;
}    

当到达类型为
char*
的变量参数列表的末尾时,它返回一个
NULL
指针。这是怎么回事

因为传递给函数的最后一个参数实际上是
NULL

PrintLines("First", "Second", "Third", "Fourth", NULL);

我希望这不是一个严肃的问题,但显然是。有人能删除它吗?我从来没有注意到示例的最后一部分。天啊!!这很尴尬。我想在第一个答案之前删除。但即使这样,它也需要投票。太好了,现在每个人都会嘲笑我的问题。@Rüppell的文化我们可以互相做;-)是的,说吧,报复我那天告诉你台湾人正在赶上匈牙利人:-(
PrintLines("First", "Second", "Third", "Fourth", NULL);