我有一个两难的地方,我有一个包含结构数组的结构......
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;
不确定我是否正确实施。
答案 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;