【问题标题】:Is it possible to use va_list for child nodes in a tree structure?是否可以将 va_list 用于树结构中的子节点?
【发布时间】:2013-03-12 17:41:58
【问题描述】:

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

struct node
{  int value;
   va_list children;
};

【问题讨论】:

    标签: c tree variadic-functions


    【解决方案1】:

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

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


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

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

    【讨论】:

      【解决方案2】:

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

      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 member children 将表现得像一个数组(但它不是数组!它是一个指向已分配内存的指针),长度为amount

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

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

      当然不要只是复制粘贴我在此处插入的代码!了解指针动态分配内存ma​​lloc()(或calloc())和free ()

      【讨论】:

        【解决方案3】:

        技术上是的,我们可以。以下为测试here.

        #include <stdarg.h>
        
        
        
        struct node
        {  int value;
           va_list children;
        };
        
        int main()
        {
        
            return 0;
        }
        

        【讨论】:

        • “它编译”但是,如何使用它..?
        • @pst:嗯,我真的不知道有意义的用法。
        • 技术上是的,我们可以”。这是最好的“是”;)
        猜你喜欢
        • 2023-03-14
        • 2010-12-12
        • 1970-01-01
        • 2015-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-19
        相关资源
        最近更新 更多