-4

问题 15.4: varargs/varargs1.html

在那里的示例代码中,他们似乎认为 ‍‍‍<code>va_argNULL在到达列表末尾时返回:

len = strlen(first);

va_start(argp, first);

while((p = va_arg(argp, char *)) != NULL)
    len += strlen(p);

va_end(argp);

但是文档va_arg明确表示情况并非如此,并且很va_arg乐意超出列表的末尾。

这与我试图模仿上述代码并因此获得段错误的经验一致。

4

3 回答 3

2

确实,va_arg没有提到NULL在列表的最后返回。

如果没有 next 参数,或者 type 与实际 next 参数的类型不兼容(根据默认参数提升),则会发生随机错误。

但常见问题解答说:

对 vstrcat 的调用看起来像

char *str = vstrcat("Hello, ", "world!", (char *)NULL);

这意味着他们假设调用者将NULL作为最后一个参数传递以表示列表的结束

于 2011-06-25T18:14:08.623 回答
2

他们在调用vstrcat() 时传递了一个NULL 指针。

A call to vstrcat looks something like

    char *str = vstrcat("Hello, ", "world!", (char *)NULL);
于 2011-06-25T18:21:14.350 回答
1

请注意vstrcat,在c-faq 文章中如何调用:

char *str = vstrcat("Hello, ", "world!", (char *)NULL);

最后一个参数为NULL。这就是 va_arg 返回的

于 2011-06-25T18:15:05.487 回答