Да, есть проблема в init_sec
// Initialize a configsection structure with a name (and 0 options)
void init_sec(configsection *sec, char *name) {
sec = malloc(sizeof(configsection));
sec->numopts = 0;
sec->name = name;
printf("%s\n", sec->name);
}
Вы просто копируете указатель имени здесь, что означает, что он указывает на оригинальное хранилище имени. Если бы вы позвонили init_sec
, как это
configsection foobar()
{
configsection sec;
char name[80];
get_name(name);
init_sec(sec, name);
return sec;
}
Указатель name
стал недействительным в момент возврата foobar
. Вам нужно продублировать строку и сохранить вашу личную копию. В init_sec
:
sec->name = strdup(name);
Но это еще не все. В самой первой строке init_sec
вы перезаписываете указатель, который был передан в init_sec
, указателем malloc. Таким образом, новый указатель никогда не передается обратно в вызов. Либо используйте указатель на указатель, вообще не берите указатель configsection (в конце концов, вы выделяете), а просто возвращайте выделенный указатель: Полная исправленная функция:
// Initialize a configsection structure with a name (and 0 options)
configsection* init_sec(char *name) {
configsection *sec = malloc(sizeof(configsection));
sec->numopts = 0;
sec->name = name;
printf("%s\n", sec->name);
return sec;
}