2

追加するsomestruct_tの配列がありますが、必要な要素の数が事前にわかりません。したがって、最初に5スロットのスペースをmallocしますが、オーバーフローしないように、配列の境界とこれまでに使用されたものを保存する別の構造体にカプセル化する必要があります。オーバーフローするように見える場合は、再割り当てします。

typedef struct {
  somestruct_t[] *data;
  uint32_t max_size;
  uint32_t used;
} something_box_t;

これはこれを行うための慣用的な方法ですか?

4

2 に答える 2

2

Cで行われることの1つは、構造体の最後に長さゼロの配列を使用し、可変数の要素に余分なスペースを割り当てることです。長さゼロの配列がCで有効かどうかはわかりませんが(C ++では使用できません)、一般的にサポートされています。

struct something_box_t {
  uint32_t max_size;
  uint32_t used;
  somestruct_t data[];
};

something_box_t *box = malloc(sizeof(something_box_t) + N*sizeof(somestruct_t));
box.max_size = N;
box.used = 0;

box.data[0] = ...;
box.data[1] = ...;

もちろん、C ++に切り替えることができれば、自分でソリューションを一緒にハックする必要はありません。std::vector<somestruct_t> box;パフォーマンスが高くないにしてもパフォーマンスが高く、Cで記述しそうなものよりも信頼性が高いため、はるかに使いやすいソリューションを作成できます。

于 2012-10-11T20:00:16.927 に答える
2

これはリンクリスト(Cでは、たとえばカーネルモードのWindowsドライバー)でよく行われることがわかります。これは、独自の実装方法の例です。

C ++は、リストをより柔軟にするためのテンプレートを提供します。

また、C ++は(のようなstd::vector)stlコンテナも提供しますが、bames53はすでにその1つを提案しています。

于 2012-10-11T20:04:45.423 に答える