Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 带指针的va_arg_C_Linked List_C99_Variadic Functions - Fatal编程技术网

C 带指针的va_arg

C 带指针的va_arg,c,linked-list,c99,variadic-functions,C,Linked List,C99,Variadic Functions,我想用指针参数初始化一个链表,如下所示: /* * 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

我想用指针参数初始化一个链表,如下所示:

/* 
 * 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;
}
问题是,叮当声错误
类型名称需要在
va_arg(va,(struct structure*)
处使用说明符或限定符,并表示类型说明符默认为int。它还注意到
(struct structure*)
struct structure*
处的实例化形式。这似乎被分配给
s
的是
int(struct structure*)

当从
(struct structure*)
中删除括号时,它可以正常编译,但是应该初始化的结构是不可访问的


当传递给va_arg的类型参数周围有括号时,为什么假定
int
?如何修复此问题?

您不能在
va_arg
中的类型周围放置括号。你不需要
va_arg
是一只奇怪的野兽。实际上,它是一个CPP宏,可以扩展为某种每编译器的魔力。如果您使用编译器查看它的扩展,您将看到编译器是如何进行扩展的。不管它是什么,它都不喜欢parens。

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);
§7.15.1.1(宏的
va_arg
要求:

参数类型应为a类型 指定的名称,以便 指向具有 可以简单地获得特定类型 通过将a*后置到类型

这就是为什么这里不允许使用括号


其他答案解释了为什么需要传入
struct structure**
并将malloc结果分配给
*s

va_arg
必须是宏。