Создание глобального указателя char

Я программирую (и действительно близок к завершению) программу CLI, чтобы проверить словарный запас пользователя или любой набор вопросов и ответов, которые он / она захочет определить.

Полный исходный код на github: https://github.com/megamasha/Vocab-Tester

Загрузка из файла и сохранение в файл обрабатываются отдельными функциями, обе вне main(). На данный момент они находятся в одном и том же исходном файле, но я хотел бы знать, как это сделать как а) в файле, так и б) в случае, если они попадают в отдельный файл операций базы данных.

Я хочу, чтобы пользователь мог сохранять в файл, который он загрузил последним, поэтому я хочу, чтобы моя функция loaddatabase() определяла глобальный char * для имени файла, к которому затем может получить доступ функция savedatabase().

Если я объявляю char * вне какой-либо функции, он доступен только для чтения, и попытка записать в него имя файла вызывает segfault. Если я объявлю его в функции loaddatabase(), savedatabase() не сможет получить к нему доступ.

Позволит ли объявление статической переменной другим функциям получить к ней доступ, или, если нет, как я могу разрешить двум функциям обращаться к одному и тому же char *?


person M_M    schedule 27.08.2011    source источник
comment
не лучше ли иметь savedatabase/loaddatabase имя файла в качестве параметра?   -  person Felice Pollano    schedule 27.08.2011


Ответы (2)


Вы можете определить глобальную переменную, определив ее в одном .c файле:

char * database;

И объявив это в файле .h:

extern char * database;

И включив файл .h в каждый файл, который использует эту переменную.

Ключевое слово extern объявляет переменную без ее определения. Это говорит компилятору, что переменная существует в другом файле.

Итак, для вашей проблемы вы можете определить char * database в файле ваших функций загрузки/сохранения и объявить его (extern char * database) в файле вашей основной функции.

Вы можете сделать то же самое с char database[1024] вместо char * database, если не хотите выделять и освобождать память для имени файла. Таким образом, вы можете напрямую писать в базу данных.

person Arnaud Le Blanc    schedule 27.08.2011
comment
Функции сохранения и загрузки, скорее всего, всегда будут в одном и том же файле, но не всегда в том же файле, что и main(). Моя проблема в том, что они находятся в отдельных функциях, но им нужен доступ к одной и той же переменной. - person M_M; 27.08.2011

Вам нужно объявить массив символов, то есть имя файла char[260].

person David Heffernan    schedule 27.08.2011