1

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

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,我想让通过容器通过函数传入的内部“扩展”和更新退出函数时要释放的临时内部数组。

需要明确的是,传递给函数的 Inner 无论如何都不会被破坏,因为它将在其他地方使用它只需要从字面上“扩展”以容纳比它最初能够容纳的更多的数据。这是我所拥有的...

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;

不确定我是否正确实施。

4

3 回答 3

1

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

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

int expandContainer(Container **container, int n)
于 2013-06-14T03:45:06.047 回答
0

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

于 2013-06-14T03:51:49.560 回答
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;
于 2013-06-14T03:58:08.977 回答