struct a {
char *name;
char *value;
struct a *next;
};
struct a *head = malloc(sizeof *head);
Выше выделено место для одного struct a
объекта, но он не инициализирует ни один из трех указателей, содержащихся в struct a
.В частности, если вы хотите, чтобы name
и value
указывали на строки, вам нужно выделить место для этих строк:
head->name = malloc(5);
strcpy(head->name, "Fred");
head->value = malloc(8);
strcpy(head->value, "abcdefg";
Это значительно упрощено.5
и 8
- «магические числа»;Вы должны указать размеры таким образом, чтобы они оставались неизменными при изменении начальных значений.И вы должны всегда проверять, возвращает ли malloc()
нулевой указатель (даже если вы просто завершаете программу с сообщением об ошибке).
Если вы не инициализируете name
и value
чтобы указать на какой-то фрагмент выделенной памяти, вы могли бы по-прежнему иметь возможность инициализировать то, на что они указывают (например, выполнив strcpy
с без malloc
с).Точнее, система не обязательно диагностирует ошибку.
Наконец, вам потребуется вызов free()
, соответствующий каждому вызову malloc()
.
Обратите внимание, что это в значительной степенипредположение на основе вашего описания.Если вы покажете нам свой реальный код, мы сможем помочь вам лучше.