是否可以在树结构中为子节点使用va_list?

saa*_*ame 2 c tree variadic-functions

是否可以使用va_list在C中定义结构?就像是:

struct node
{  int value;
   va_list children;
};
Run Code Online (Sandbox Code Playgroud)

Cor*_*bin 9

从技术上讲,你可以拥有一个va_list结构元素,但它没有多大意义.该va_*API是非常专业的.特别是,没有用于向元素添加元素的公共API,va_list因此您无法完全使用它.

消费代码知道,va_list用参数列表神奇地填充.它们并不打算用作存储任何你想要的通用列表.即使你可以欺骗或操纵va_list它可用,这也是错误的道路.


我建议你使用简单的链表或矢量.即使是通用的方式,两者都很容易制作.

另一种选择是直接管理内存.如果您只想分配孩子一次,这将是一个非常可行的选择.如果您计划动态添加/删除子项,则更高级别的数据结构将更容易使用.


pam*_*eho 5

我打赌这不是你想做的.

va_list用于功能.A struct可能会将其用作成员,但这不会像您想要的那样工作.

如果要为树节点提供无限量的可能子节点,则需要动态分配它.

要在C中动态分配内存,您需要阅读有关指针的内容.

你可以这样做:

struct node
{
    int value;
    node *children; // "node *" means POINTER TO node.
};
Run Code Online (Sandbox Code Playgroud)

然后,在代码中,您可以创建一个为您的节点分配足够空间的函数,例如:

void node_allocate(struct node *n, int amount)
{
    n->children = malloc(amount * sizeof(node));
}
Run Code Online (Sandbox Code Playgroud)

在调用该函数之后,struct nodemember children将表现得像一个数组(但它不是一个数组!它是指向已分配内存的指针),长度为amount.

在程序结束时,您应该释放程序使用的内存,如下所示:

void node_deallocate(struct node *n)
{
    free(n->children);
}
Run Code Online (Sandbox Code Playgroud)

当然不要只是复制我在这里插入的代码!阅读指针,动态分配内存,malloc()(或calloc())和free()!