4

ファイルとの間で読み込んだり、ユーザーが入力したりする構造体の配列 (実際には 2 つの構造体の配列ですが、簡単にするために 1 つ含まれています) のメモリを動的に再割り当てしようとしています。

typedef Struct
{
    char surname[21];
    char firstname[21];
    char username[21];
...
} User;

...メイン()で:

int size = 0; /* stores no. of structs */
User* user_array = (User *) calloc(1, sizeof(User));
if(user_array == NULL)
{
    printf("Cannot allocate initial memory for data\n");
    exit(1);
}
else
    size++;

次に、必要に応じて関数呼び出しを使用して配列を増やしようとしています。

int growArray(User user_array*, int size)
{
    User *temp;
    size++;
    temp = (User *) realloc(user_array, (size * sizeof(User));
    if(temp == NULL)
    {
        printf("Cannot allocate more memory.\n");
        exit(1);
    }
    else
        user_array = temp;
    return size;
}

残念ながら、再割り当ては機能しません。どちらの構造体もインスタンスあたり約 200 バイトしかなく、初期サイズを 10 に設定すると問題なく動作するため、realloc を使用しようとしている方法に問題があるはずです。

システムは Win 7 64 で、4GB の Core i5 で、Quincy (MinGW GUI) を実行しています。

4

2 に答える 2

7

reallocが指すメモリのサイズをuser_array指定されたサイズに変更します。サイズによって増加するわけではありません。あなたの関数が呼び出されているのを見てgrowArray、配列のサイズを だけ増やしたいと思いますsize。その場合、次のことが必要です。

int growArray(User **user_array, int currentSize, int numNewElems)
{
    const int totalSize = currentSize + numNewElems;
    User *temp = (User*)realloc(*user_array, (totalSize * sizeof(User)));

    if (temp == NULL)
    {
        printf("Cannot allocate more memory.\n");
        return 0;
    }
    else
    {
        *user_array = temp;
    }

    return totalSize;
}

growArrayのアドレスを取得することに注意してくださいuser_array。これはrealloc、既存のブロックを必要なサイズに拡張できない場合にメモリを移動する可能性があるためです。

使用するには:

int size = 0;
User* user_array = (User *) calloc(1, sizeof(User));
if(user_array == NULL)
{
    printf("Cannot allocate initial memory for data\n");
    exit(1);
}

/* add 10 new elements to the array */
size = growArray(&user_array, size, 10);
于 2011-05-29T21:15:55.687 に答える
4

user_array の値をローカルで変更しています。関数が戻ると、値は失われます。代わりに、ポインターを user_array ポインターに渡します。

于 2011-05-29T19:42:10.453 に答える