Realloc массив структур - PullRequest
2 голосов
/ 29 мая 2011

Я пытаюсь динамически перераспределить память для массива структур (на самом деле это массив каждой из 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;
}

К сожалению, realloc никогда не работает. Обе структуры занимают всего около 200 байт на экземпляр, и установка начального размера, равного 10, будет работать нормально, поэтому должно быть что-то не так с тем, как я пытаюсь использовать realloc.

Система - Win 7 64, на Core i5 с 4 ГБ, работающая с Quincy (графический интерфейс MinGW).

Ответы [ 2 ]

6 голосов
/ 30 мая 2011

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);
3 голосов
/ 29 мая 2011

Вы изменяете значение user_array локально. Значение теряется, когда функция возвращается. Вместо этого передайте указатель на указатель user_array.

...