次の形式の構造体があります。
typedef struct node {
unsigned int * keys;
unsigned int * branches;
} NODE;
キーとブランチの数は実行時に決定されますが、既知です。これは別の構造体から派生しています。
typedef struct tree {
unsigned int num_keys_per_node;
} TREE;
NODE
このに を割り当てるにはTREE
、手動の手順は次のようになります。
NODE node;
unsigned int keys[tree->num_keys_per_node];
unsigned int branches[tree->num_keys_per_node + 1];
node.keys = keys;
node.branches = branches;
これらのノードの多くをタイトなループ内に割り当てる必要がありますが、データ構造をトラバースするときに一時的にのみ使用し、ノードのトラバーサルが続くとすぐにそれらを破棄します。malloc()
ポインター、キー、ヒープ上の分岐を返す関数をfree()
手動で作成することもできますが、可能であればスタックを使用することをお勧めします。
この初期化ロジックは多くの場所で繰り返されるため、マクロを定義して、次のようなことを効果的に行うにはどうすればよいですか。
NODE node = CREATE_NODE_FOR_TREE(tree);
プリプロセッサが有効な構文を提供する結果となるこれを行う方法を見つけるのが難しいです。
スタック メモリでの動的な構造体の割り当てに対する他のアプローチも聞けてうれしいです。
編集 | メモリ内に同時に複数のノードが必要になることはないため、1 つの構造体を繰り返し再利用することもできます。