перераспределение массива структур - PullRequest
0 голосов
/ 14 мая 2018

, поэтому я потратил несколько часов, пытаясь выяснить, почему мой realloc не увеличивает мой массив структур, но, похоже, я не прогрессирую.Realloc не работает или не увеличивает массив.Есть ли какая-то очевидная ошибка, которую я совершаю?

#include <getopt.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>


typedef struct fileInfo {
    char accessRights[12];
    short hardLinks;
    short userName;
    short groupName;
    long size;
    char *time;
    char *fileName;
    short nrOfNode;
} fileInfo;


void enlargeFileInfos(fileInfo *fileInfoArray, int currentSize)
{
    fileInfo *temp = (fileInfo*)realloc(fileInfoArray, (currentSize + 1) * sizeof(fileInfo));
    if (!temp) {
        printf("realloc --FAILED--\n");
        return;
    }
    fileInfoArray = temp;
    printf("fileInfo grew to %d item(s)\n", currentSize + 1);
}

int main( )
{
    size_t nrOfDirs = 1;
    fileInfo *fileInfoArr = malloc(sizeof(fileInfo));

    for (int i = 0; i < 5; i++) {
        enlargeFileInfos(fileInfoArr, nrOfDirs);
        nrOfDirs++;
    }
    return 0;
}

1 Ответ

0 голосов
/ 14 мая 2018

В realloc памяти, в которой fileInfoArray указывает на enlargeFileInfos, вы должны передать его адрес функции:

void enlargeFileInfos(fileInfo **fileInfoArray, int currentSize)
{
    fileInfo *temp = realloc(*fileInfoArray, (currentSize + 1) * sizeof(fileInfo));
    if (temp == NULL) {
        printf("realloc --FAILED--\n");
        return;
    }
    *fileInfoArray = temp;
    printf("fileInfo grew to %d item(s)\n", currentSize + 1);
}

Затем вы вызываете функцию следующим образом:

enlargeFileInfos(&fileInfoArr, nrOfDirs);

Как указал Джонатан Леффлер в комментариях, альтернативный способ - вернуть realloc ed память из функции enlargeFileInfos:

fileInfo *enlargeFileInfos(fileInfo *fileInfoArray, int currentSize)
{
    fileInfo *temp = realloc(fileInfoArray, (currentSize + 1) * sizeof(fileInfo));
    if (temp == NULL) {
        printf("realloc --FAILED--\n");
        return NULL;
    }
    printf("fileInfo grew to %d item(s)\n", currentSize + 1);
    return temp;
}

И затем, вы используете это следующим образом:

fileInfoArr = enlargeFileInfos(fileInfoArr, nrOfDirs);
if (fileInfoArr == NULL) {
    /* Handle allocation failure */    
}

И после того, как вы закончите работать с fileInfoArr, не забудьте освободить его:

free(fileInfoArr);

Я удалил приведение из realloc, поэтому взгляните на Должен ли я привести приведение к результату malloc? и измените сигнатуру main на int main(void).

...