Создание глобального указателя на символ - PullRequest
0 голосов
/ 27 августа 2011

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

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 27 августа 2011

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

char * database;

И, объявив его в .h файле:

extern char * database;

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

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

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

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

1 голос
/ 27 августа 2011

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

...