Как мне создать динамическое распределение памяти, используя malloc для структур в C?

Я хочу динамически выделять память для "заголовка", так как не знаю, как долго будут заголовки. У меня есть следующий код:

#include<stdio.h>
#include<malloc.h>

struct film {
    char title[500];
    int year;
    int duration;
    int earnings;
};

void main() {
    int n;
    scanf("%d", &n);
    int array[n], i = 0;
    struct film user[n];

    while (i < n) {
        scanf("%s", &user[i].title);
        scanf("%d", &user[i].year);
        scanf("%d", &user[i].duration);
        scanf("%d", &user[i].earnings);
        i += 1;
    }
}

Я попытался заменить:

char title[500];

с:

char *title = (char*)malloc(sizeof(char));

Однако это не сработало. Он говорит, что ожидает что-то еще до "=". Кроме того, как мне отсканировать ввод от пользователя для заголовка, если он выделяется динамически?

Как мне освободить память позже? Я предполагаю, что это как ниже:

void freememory(struct film target,  n) { //n is size of structure
    int i = 0;
    while (i < n) {
        free(target[i].title);
        i += 1;
    }

Правильный?

1 ответ

Решение

Часть struct - это просто объявление, вы не можете выполнить там никакого кода. malloc может быть выполнен только во время выполнения. То есть ваша структура должна быть

typedef struct {
    char* title;
    int year;
    int duration;
    int earnings;
} film;

Тогда позже

film user[n];

for(int i=0; i<n; i++)
{
  char title [200];
  scanf("%s", title);  // scan to temporary buffer since we don't know length
  ...

  user[i]->title = malloc(strlen(title) + 1); // alloc just as much as is needed
}

Ваш free() код работает.

Обратите внимание, что этот код довольно наивен; Подобное микроуправление памятью может быть не самой лучшей идеей в реальных приложениях. Вместо этого выберите фиксированную максимальную длину строки, а затем убедитесь, что входные данные не превышают ее, возможно, это будет лучший план, используя fgets вместо scanf,

Другие вопросы по тегам