stdarg 和 NULL 参数
我想要一个函数,当使用不同数量的参数调用时,返回第一个非 NULL 参数。我已经尝试过这个,但它在 for
循环上进行核心转储:
char *first(char *args, ...)
{
va_list ap;
char *r = NULL, *p;
va_start(ap, args);
for (p = args; *p; p++) {
r = va_arg(ap, char*);
if (r != NULL) break;
}
va_end(ap);
return r;
}
char *q = NULL;
char *w = NULL;
char *e = "zzz";
char *r = NULL;
printf("%s\n", first(q, w, e, r)); // ought to print "zzz"
I want a function that, when called with a varying number of arguments, return the first non-NULL one. I've tried this, but it core dumps on for
loop:
char *first(char *args, ...)
{
va_list ap;
char *r = NULL, *p;
va_start(ap, args);
for (p = args; *p; p++) {
r = va_arg(ap, char*);
if (r != NULL) break;
}
va_end(ap);
return r;
}
char *q = NULL;
char *w = NULL;
char *e = "zzz";
char *r = NULL;
printf("%s\n", first(q, w, e, r)); // ought to print "zzz"
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
args
不是参数数组。这只是您传递给first
的第一个参数。所以在这种情况下它的值就是q
的值。您不能像现在一样迭代 va args。
这样做:
如果你没有非 NULL 参数,这将会崩溃,所以你最好将参数的数量作为第一个参数传递:
或者,使用哨兵:
args
is not an array of arguments. It's just the first argument you passed tofirst
. So its value in this case is the value ofq
.You can't iterate over va args like you are doing.
Do this:
This will crash if you have no non-NULL argument, though, so you would better pass the number of arguments as first argument:
Alternatively, use a sentinel: