Как создать динамическое выделение памяти, используя malloc для структур в C? - PullRequest
0 голосов
/ 29 мая 2018

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

#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 Ответ

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

Часть 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.

...