c,malloc和realloc结构数组

时间:2012-09-27 23:44:59

标签: c malloc realloc

假设我有一个名为Thing的结构。如果我想要一个“Thing”数组,但它没有固定大小(动态),我该如何为它分配空间?我最初是为数组本身malloc空间,然后每次向其添加元素时都必须重新分配空间吗? 例如:

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;

如何设置malloc和realloc以便能够将类似Thing的元素添加到“Thing”数组中?

4 个答案:

答案 0 :(得分:3)

您可能希望使用dynamic array策略:跟踪其中的项目数量和当前容量,然后在填满时将容量加倍。您可以获得摊销线性时间和数组的随机访问权。

答案 1 :(得分:0)

你可以从NULL指针(Thing * thingarray = NULL;)开始,因为数组中没有任何内容。

在添加项目时,您需要为每个项目分配内存。使用malloc作为第一个项目,并使用realloc作为其他项目。

答案 2 :(得分:0)

你需要将它用于一定数量的“东西”

说:malloc(sizeof(thing)* 8)为其中的八个获得空间。

如果需要更多空间,则必须使用临时变量重新分配空间。

答案 3 :(得分:-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;
}