是否可以使用va_list在C中定义结构?类似的东西:
struct node
{ int value;
va_list children;
};
答案 0 :(得分:9)
从技术上讲,你可以将va_list
作为结构的一个元素,但它没有多大意义。 va_*
API非常专业。特别是,没有用于向va_list
添加元素的公共API,因此您无法完全使用它。
就消费代码而言,va_list
可以通过参数列表神奇地填充。它们并不打算用作存储任何你想要的通用列表。即使你可以欺骗或操纵va_list
可用,也是错误的道路。
我建议您使用简单的链接列表或向量。即使是通用的方式,两者都很容易制作。
另一种选择是直接管理内存。如果您只想分配孩子一次,这将是一个非常可行的选择。如果您计划动态添加/删除子项,则更高级别的数据结构将更易于使用。
答案 1 :(得分:5)
我打赌这不是你想要做的。
va_list
用于功能。 struct
可能会将其用作成员,但这不会像您想要的那样工作。
如果您想为树节点提供无限量的可能子节点,则需要将其动态分配。
要在 C 中分配动态内存,您需要阅读指针。
你可以这样做:
struct node
{
int value;
node *children; // "node *" means POINTER TO node.
};
然后,在代码中,您可以创建一个为节点分配足够空间的函数,例如:
void node_allocate(struct node *n, int amount)
{
n->children = malloc(amount * sizeof(node));
}
调用该函数后,struct node
成员children
将表现得像一个数组(但它不是数组!它是指向已分配内存的指针),长度为amount
。< / p>
在程序结束时,您应该释放程序使用的内存,如下所示:
void node_deallocate(struct node *n)
{
free(n->children);
}
当然不要只是复制我在这里插入的代码!阅读指针,动态分配内存, malloc()(或 calloc())和免费()强>!
答案 2 :(得分:1)
技术上是的,我们可以。以下内容经过测试here.
#include <stdarg.h>
struct node
{ int value;
va_list children;
};
int main()
{
return 0;
}