stdarg和NULL参数

时间:2011-09-16 19:05:21

标签: c variadic-functions

我想要一个函数,当使用不同数量的参数调用时,返回第一个非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"

1 个答案:

答案 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);