2

va_listを使用してCで構造体を定義することは可能ですか?何かのようなもの:

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

3 に答える 3

9

技術的には、構造体の要素としてaを使用できますが、va_listあまり意味がありません。va_*APIは非常に特殊化されています。特に、要素を追加するためのパブリックAPIva_listがないため、正確に多くのことを行うことはできません。

消費するコードが知っている限りva_list、引数リストを魔法のように入力してください。これらは、必要なものを格納するための汎用リストとして使用するためのものではありません。だましva_listて使用できるように操作できたとしても、それは間違った道です。


単純なリンクリストまたはベクトルのいずれかを使用することをお勧めします。どちらも、一般的な方法でも非常に簡単に作成できます。

もう1つのオプションは、メモリを直接管理することです。これは、子を1回だけ割り当てることに関心がある場合に非常に実行可能なオプションです。ただし、子を動的に追加/削除することを計画している場合は、より高いレベルのデータ構造を使用する方が簡単です。

于 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 に答える