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

0

malloc の代わりに realloc を使用してみてください。新しく割り当てられたポインターと変数を NULL (または 0) に初期化することは常に良い考えです。古い配列を新しい配列にコピーするために memcpy を使用できます (malloc またはより適切な calloc に固執する場合)。

于 2013-06-14T03:51:49.560 に答える