strtok
возвращает указатели на подстроки своего ввода.Таким образом, все ваши tok
значения являются указателями на части line
, который имеет автоматическую продолжительность хранения, и поэтому указатели в stateCityZip
все становятся недействительными после возврата zipToCity
.
(На самом деле, если естьЕсли в файле находится более одной строки, все указатели tok
становятся недействительными, как только вы переходите к следующей строке, поскольку теперь они указывают на произвольные подстроки новой строки в буфере.)
ВместоВы должны использовать strdup
, чтобы выделить копию токена в виде новой строки и сохранить указатель, возвращенный из strdup
в stateCityZip
.
Важное примечание: строки, выделенные strdup
нужно освободить по free
.Если stateCityZip
является глобальным, то вы можете избежать освобождения их (последняя память будет освобождена при выходе из вашего процесса).Но если zipToCity
когда-либо будет вызван снова, он перезапишет указатели в stateCityZip
и пропустит соответствующие строки.Так что, вероятно, было бы безопаснее сначала free()
любых строк в stateCityZip
(если они равны NULL, тогда все в порядке, поскольку free(NULL)
не используется) перед присвоением новых значений.
Вкл.тема выделения памяти: ваш пример кода имеет malloc
вызов для tok
, который является полностью лишним и который гарантированно будет утечкой, поскольку вы перезаписываете указатель, возвращенный из malloc
, без free
его.
И, на предмет хорошей практики кодирования: fopen
может потерпеть неудачу.Вам нужно проверить, что возвращаемое FILE *
не равно NULL.(Если он равен NULL, errno
скажет вам, почему.) И вам также нужно fclose
FILE *
, чего вы, похоже, тоже не делаете.
В целом: ни один изэтот код, кажется, выполняет какую-либо проверку ошибок вообще.Каждый раз, когда вы вызываете любую стандартную библиотечную функцию (или вообще любую функцию, если на то пошло!), Вам нужно подумать о том, как эта функция может не выполнить то, что должна, как вы сможетескажи (обычно поведение при сбое хорошо документировано, поэтому обязательно прочитайте документы) и что вы хотите, чтобы ваша программа делала в случае сбоя.Что должно произойти, если файл не существует или не может быть прочитан?Если он содержит строку, которая не разделена запятыми или не содержит ожидаемого количества полей?Что должно произойти, если вам не хватает памяти на полпути при обработке файла, или если strdup
не может скопировать строку, потому что у вас недостаточно динамической памяти?Если вы не думаете об этих проблемах или забыли заняться ими, вы можете сойти с рук в «счастливом случае», когда все работает, но рано или поздно он вернется и укусит вас - часто в худшем случаевозможное время.