我想用类似这样的指针参数来初始化一个链表:
/*
* 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/