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

标签 c null-pointer variadic-functions

这是下面知名链接中关于 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

Program Source Link

最佳答案

When the end of a variable argument list of type char * is reached, it returns a NULL pointer. How is it so?

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

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

关于c - 为什么 va_arg 在 char* 类型的变量参数列表的末尾返回 NULL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16425007/

相关文章:

java - 可变参数与方法重载

c++ - 带有 %s 和 std::string 的 sprintf 给出乱码

c - 在 C 中反序列化文本文件数据(链表)

python - Py_Finalize() 在 Python 出错后崩溃

c - Doxygen:\static 命令忽略 C 成员函数

C++在范围结束后丢失指针引用

c++ - 不退出怎么处理空指针?

c - 如何填写 va_list

c - 已编译二进制文件中的预初始化函数指针?

java - try/catch vs if/else 抛出 NullPointerException