comp.lang.c FAQ中有错误吗?计算可变格式字符串的长度

时间:2011-06-25 18:09:38

标签: c variadic-functions

问题15.4:http://c-faq.com/varargs/varargs1.html

在那里的示例代码中,他们似乎认为如果已到达列表的末尾,则va_arg返回NULL:

    len = strlen(first);

va_start(argp, first);

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

va_end(argp);

但是va_arg的文档明确说明情况并非如此,并且va_arg将很乐意超越列表的末尾。这与我尝试模仿上述代码并因此得到段错误的经验一致。

3 个答案:

答案 0 :(得分:2)

确实,va_arg未提及在列表的第n位返回NULL

  

如果没有下一个参数,或者如果   type与类型不兼容   实际的下一个论点(如   根据默认提升   参数促销),随机错误   会发生。

但常见问题解答说:

  

对vstrcat的调用类似于

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

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

答案 1 :(得分:2)

他们在对vstrcat()的调用中传递一个NULL指针。

A call to vstrcat looks something like

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

答案 2 :(得分:1)

请注意the c-faq articlevstrcat的调用方式:

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

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