Как мне создать динамическое распределение памяти, используя 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
,