动态地将结构数组扩展为更大的大小

时间:2013-06-14 03:38:50

标签: c arrays pointers struct int

我有一个两难的地方,我有一个包含结构数组的结构......

typedef struct Container{
    struct Inner *F;
    int length;
} Memo;

typedef struct Inner{
    int *digits;
    int length;
} Inner;

我称之为这个功能:

int expandContainer(Container *container, int n)

所以基本上当我将这个'容器'传递给'expandContainer'时,我初始化一个大小的新内部数组然后malloc它我想让通过容器通过函数传入的内部被“扩展”并更新,并在退出函数时释放临时内部数组。

要明确的是,传递给函数的内部函数不会被破坏,因为它将被用于其他地方,它只需要逐字地“扩展”以保存比原始数据更多的数据。这就是我的......

int arrayLength, i;

//Get new array length
if(((memo->length * 2) + 1) > (n * 2 + 1))
    arrayLength = ((memo->length * 2) + 1);
else
    arrayLength = (n * 2 + 1);

//Create new Array
Inner *biggerArray;

//Malloc new array of Inner Structs
biggerArray = malloc(sizeof(Inner) * arrayLength);

    //Check for errors
    if(biggerArray == NULL)
        panic("ERROR: out of memory in expandContainer()\n");

//Copy data from container->F into biggerArray
for(i=0; i<container->length; i++)
    biggerArray[i] = container->F[i];

//Initialize remaining data in biggerArray
for(i=container->length; i<arrayLength; i++)
    {
        biggerArray[i].digits = NULL;
        biggerArray[i].length = 0;
    }

//Free the old array
for(i=0; i<arrayLength; i++)
    //!!!!THIS DOESN'T WORK!!!!!
    &(memo->F[i]) = &biggerArray[i];

//free the biggerArray created in the function
free(biggerArray);

//update the length of memo
memo->length = arrayLength;

printf("-> Expanded Container capacity to %d.\n", arrayLength);

return arrayLength;

不确定我是否正确实施。

3 个答案:

答案 0 :(得分:1)

对于扩展本身,您可以使用realloc。它完全符合您的需求。分配一个新的(更大的)区域,复制数据并释放旧数据。

如果你想用expandContainer()这样的函数包装它。它必须通过引用获取指针:

int expandContainer(Container **container, int n)

答案 1 :(得分:0)

尝试使用realloc而不是malloc,将新分配的指针和变量初始化为NULL(或0)总是一个好主意 你可以使用memcpy将旧数组复制到新数组(如果你想坚持使用malloc或更好的calloc)

答案 2 :(得分:0)

这有用吗?

//Free the old array
free(memo->F);
// you don't free the biggerArray, instead
memo->F = biggerArray;
//update the length of memo
memo->length = arrayLength;