Как я могу создать динамически распределенный массив структур? - PullRequest
1 голос
/ 28 октября 2019

Для этой проблемы мне дают список фильмов, их жанр и т. Д. Затем я должен прочитать этот файл и поместить его в массив структур. Я пытаюсь динамически распределить массив, но я не знаю, как это сделать правильно.

У меня это как

list1 = (list_t *)malloc(n * sizeof(int));

Не уверен, что с этим не так, но я уверен, что это здесь.

Ответы [ 2 ]

0 голосов
/ 28 октября 2019

Оператор sizeof(int) дает вам только это, размер в байтах целого числа. Итак, в выражении:

movies = (list_t *)malloc(n * sizeof(int));

Вы фактически выделяете пространство памяти для n целых чисел, что было бы хорошо, если бы ваш list_t имел размер, равный целому числу, но это не так,Вам нужно выделить место для n list_t s следующим образом:

movies = malloc(n * sizeof(list_t));

Кроме того, вы закрываете указатель файла с помощью fclose(pointer), но затем используете его в следующем цикле for: fscanf(pointer, ...), это ошибка. Вы можете сделать fopen снова или сбросить fclose и использовать fseek, чтобы вернуться к началу файла. В заключение, вам не нужно использовать m в этом цикле, вы можете использовать i следующим образом:

..., movies[i].title, movies[i].genre, &movies[i].avscore, movies[i].rating, &movies[i].rentals, &movies[i].year);

, а затем удалить оператор m++ вместе с mпеременная в целом.

0 голосов
/ 28 октября 2019

movies = (list_t *)malloc(n * sizeof(int)); Выделяет одно целое число для каждой записи, а не записи. Это означает, что у вас не так много места, как вам нужно, и вы читаете данные в память, которой у вас нет. Это неопределенное поведение. Вам нужно movies = malloc(n * sizeof(list_t));

Вы также используете FILE* pointer после закрытия файла. Это не сработает ...

Дополнительный совет: зачем использовать m во втором цикле? Просто используйте i напрямую. Не используйте имя pointer для FILE*. fp обычно используется inputfile возможно лучше.

...