gpt4 book ai didi

c - 带指针的 va_arg

转载 作者:太空狗 更新时间:2023-10-29 15:53:39 25 4
gpt4 key购买 nike

我想像这样用指针参数初始化一个链表:

/* 
* 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 at va_arg(va, (struct structure *)),并表示类型说明符默认为诠释。它还在 (struct structure *)struct structure * 处记录了实例化形式。这似乎被分配给 s 的是 int (struct structure *)

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

为什么当括号围绕传递给 va_arg 的类型参数时假定为 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com