我想用类似这样的指针参数来初始化一个链表:

/*
 * Initialize a linked list using variadic arguments
 * Returns the number of structures initialized
 */
int init_structures(struct structure *first, ...)
{
    struct structure *s;
    unsigned int count = 0;
    va_list va;
    va_start(va, first);

    for (s = first; s != NULL; s = va_arg(va, (struct structure *))) {
        if ((s = malloc(sizeof(struct structure))) == NULL) {
            perror("malloc");
            exit(EXIT_FAILURE);
        }
        count++;
    }

    va_end(va);

    return count;
}

问题是clang在type name requires a specifier or qualifier处将va_arg(va, (struct structure *))错误,并指出类型说明符默认为int。它还指出了(struct structure *)struct structure *的实例化形式。这似乎是分配给s的是int (struct structure *)

(struct structure *)除去括号后,它可以很好地编译,但是无法访问应该初始化的结构。

当括号放在传递给va_arg的type参数周围时,为什么要使用int?我怎样才能解决这个问题?

最佳答案

va_arg在许多系统上是一个宏,显然struct structure *周围的括号导致该宏扩展,因此无法解析。所以不要那样做。

这与初始化的结构“不可访问”无关。您正在分配结构并将其分配给s,但是s是局部变量。您不能通过分配给局部变量来影响调用方中的值。要完成您想做的事情,调用者需要传递一个指向一个指针的指针,然后您可以初始化该指针

int init_structures(struct structure **first, ...)
{
    struct structure **s;
    unsigned int count = 0;
    va_list va;
    va_start(va, first);

    for (s = first; s != NULL; s = va_arg(va, struct structure **)) {
        if ((*s = malloc(sizeof(struct structure))) == NULL) {
            perror("malloc");
            exit(EXIT_FAILURE);
        }
        count++;
    }

    va_end(va);

    return count;
}

调用者应该这样做:
struct structure *a, *b;
init_structures(&a, &b, NULL);

关于c - va_arg与指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2845638/

10-13 05:54