Проблема в том, что read_name
возвращает адрес локальной переменной (line
).Эта локальная переменная выходит из области видимости (и технически перестает существовать), когда функция возвращается.Таким образом, использование возвращенного указателя приводит к неопределенному поведению .
. Чтобы увидеть проблему более ясно, вот упрощенная версия read_name
с отображением только соответствующих строк:
char *read_name(int par_id, char *filepath){
char *par_name;
char line[256]; // line is a local variable
while (fgets(line, sizeof line, file) != NULL){
par_name = line; // par_name now points to the local variable
}
}
return par_name; // returning the address of the local variable
}
В комментариях к вопросу было отмечено, что read_name
был протестирован и признан работоспособным.Так как это может быть неправильно?Это самое плохое в неопределенном поведении в C. Иногда код работает во время тестирования, даже если он технически некорректен.А под технически неверным я подразумеваю, что в какой-то момент он сломается .Например, в функции store
, если вы добавите еще один вызов функции между вызовом read_name
и вызовом fprintf
, есть большая вероятность, что name
будет поврежден и не будет печататься должным образом.
Простым решением в этом случае является объявление line
с ключевым словом static
:
static char line[256];
Таким образом, line
имеет статическую продолжительность хранения, что означает, что он будет продолжатьсясуществовать после возвращения read_name
.