2

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

struct node
{  int value;
   va_list children;
};
4

3 回答 3

9

从技术上讲,您可以将 ava_list作为结构的元素,但这没有多大意义。va_*API 非常专业。特别是,没有用于向 a 添加元素的公共 API,va_list因此您无法完全使用它。

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


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

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

于 2013-03-12T17:49:20.437 回答
5

我敢打赌这不是你想做的。

va_list用于函数。Astruct可能可以将其用作成员,但这不会像您想要的那样工作。

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

要在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));
}

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

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

void node_deallocate(struct node *n)
{
    free(n->children);
}

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

于 2013-03-12T17:59:22.820 回答
1

技术上是的,我们可以。下面在这里进行测试。

#include <stdarg.h>



struct node
{  int value;
   va_list children;
};

int main()
{

    return 0;
}
于 2013-03-12T17:49:12.317 回答