Недопустимая ошибка компилятора инициализатора при mallo c массива struct - PullRequest
0 голосов
/ 29 апреля 2020

Я пытаюсь прочитать произвольное количество строковых элементов в массиве структур при инициализации моей программы. Я хочу выделить кучу памяти для

Когда компилятор попадает в следующую строку, он выдает error: invalid initializer.

Первая часть моего кода:

int main() {
    printf("Work starts in the vineyard.\n");

    typedef struct {
        char* name[20];
        unsigned int jobs;
    }Plantation;

    // read from list of plantations
    FILE  *plantationFile = fopen("./data/plantations.txt", "r");
    if (plantationFile==NULL) {perror("Error opening plantations.txt."); exit(1);}

    char line[20];
    char *lp = line;
    int plantationCount;
    Plantation plantations[] = (Plantation *)malloc(sizeof(Plantation));
    if (!feof(plantationFile)) {
        int i = 0;
        fgets(line, 20, plantationFile);
        scanf(lp, "%i", &plantationCount);
        realloc(plantations, sizeof(Plantation) * plantationCount);
        while( !feof(plantationFile) ) {
            fgets(line, 20, plantationFile);
            strcpy(*(plantations[i].name), lp);
            plantations[i].jobs = 1u;
            ++i;
        }
    }
...

Чего мне здесь не хватает?

Вывод компилятора:

$ gcc -W -Wall vineyard.c
vineyard.c: In function ‘main’:
vineyard.c:30:32: error: invalid initializer
     Plantation plantations[] = (Plantation *)malloc(sizeof(Plantation));
                                ^

Он также выдает то же самое, если я пропущу приведение типов.

$ gcc -W -Wall vineyard.c
vineyard.c: In function ‘main’:
vineyard.c:30:32: error: invalid initializer
     Plantation plantations[] = malloc(sizeof(Plantation));
                                ^~~~~~

Спасибо!

1 Ответ

0 голосов
/ 29 апреля 2020

Вы определяете plantations как массив и пытаетесь инициализировать массив указателем. Инициализатор для массива должен быть заключенным в скобки списком инициализаторов. Что еще более важно, хотя массивы и указатели связаны, они не одно и то же.

Определите plantations как указатель вместо массива:

Plantation *plantations = malloc(sizeof(Plantation));

Также, realloc может измените, куда указывает выделенная память, поэтому вам нужно вернуть возвращаемое значение:

plantations = realloc(plantations, sizeof(Plantation) * plantationCount);

Также следует проверить возвращаемое значение malloc и realloc на наличие ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...