0

Thing という構造体があるとします。「モノ」の配列が必要な場合でも、サイズが固定されていない (動的) 場合、その配列にスペースを割り当てるにはどうすればよいですか? 最初に配列自体のスペースを割り当ててから、要素を追加するたびにスペースを再割り当てする必要がありますか? 例えば:

struct Thing{
    char *stuff;
    char **morestuff;
    int evenmorestuff;
};

Thing *thingarray;
thingarray = malloc(sizeof(Thing));

....

//And then allocating space for elements, which will get called an unknown amount of times
Thing j;
thingarray[count] = j;

"Thing" の配列に Thing 型の要素をできるだけ多く追加できるように malloc と realloc を設定するにはどうすればよいですか?

4

4 に答える 4

3

おそらく、動的配列戦略を使用することをお勧めします。その中に含まれるアイテムの数と現在の容量を追跡し、それがいっぱいになったら容量を 2 倍にします。償却された線形時間と配列のランダムアクセスが得られます。

于 2012-09-27T23:54:50.140 に答える
0

配列には何もないため、NULL ポインター (Thing *thingarray = NULL;) から開始できます。

アイテムを追加すると、各アイテムにメモリを割り当てる必要があります。最初のアイテムに malloc を使用し、追加のアイテムに realloc を使用するとうまくいきます。

于 2012-09-27T23:52:53.393 に答える
0

一定量の「モノ」に対してmallocする必要があります

言います: malloc(sizeof(thing)*8) で 8 つのスペースを確保します。

さらにスペースが必要な場合は、一時変数を使用してスペースを再割り当てする必要があります。

于 2012-09-27T23:54:45.560 に答える
-1

可能であれば、動的配列にベクトルを使用してみてください。それはあなたに多くの時間を節約し、あなたは割り当てについて心配する必要はありません:

#include <vector>
using namespace std;

struct Thing
{
    char *stuff; 
    char **morestuff; 
    int evenmorestuff; 
};

int _tmain(int argc, _TCHAR* argv[])
{
    vector<Thing> vt;

    char stuff = 'a';
    char *morestuff = "abc";

    Thing t;
    t.stuff = &stuff;
    t.morestuff = &morestuff;
    t.evenmorestuff = 0;

    int count = 10;
    for (int i = 0; i <= count; ++i)
    {
        t.evenmorestuff = i;
        vt.push_back(t);
    }

    Thing j; 
    j.stuff = &stuff;
    j.morestuff = &morestuff;
    j.evenmorestuff = 0;

    vt[count] = j; 

    return 0;
}
于 2012-09-28T00:34:13.707 に答える