我想要一个函数,当使用不同数量的参数调用时,返回第一个非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"
答案 0 :(得分:11)
args
不是参数数组。这只是您传递给first
的第一个参数。因此,在这种情况下,它的值是q
的值。
你不能像过去那样迭代 over va args。
这样做:
va_start(ap, args);
do {
r = va_arg(ap, char*);
if (r != NULL) break;
} while (1);
va_end(ap);
如果你没有非NULL参数,这将会崩溃,所以你最好将参数的数量作为第一个参数传递:
char *first(int nargs, ...)
{
char *r = NULL;
va_start(ap, nargs);
for( ; nargs; nargs--) {
r = va_arg(ap, char*);
if (r != NULL) break;
}
va_end(ap);
return r;
}
first(4, q, w, e, r);
或者,使用哨兵:
char *first(char *first, ...)
{
char *r = first;
va_start(ap, first);
while (!r) {
r = va_arg(ap, char*);
}
va_end(ap);
return r == &sentinel ? NULL : r;
}
char sentinel; // its address is unique among other pointers
first(q, w, e, r, &sentinel);