问题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将很乐意超越列表的末尾。这与我尝试模仿上述代码并因此得到段错误的经验一致。
答案 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 article中vstrcat
的调用方式:
char *str = vstrcat("Hello, ", "world!", (char *)NULL);
最后一个参数是NULL。这就是va_arg返回的内容