Вопрос следующий, есть у меня переменная, допустим text, описанная в main.h как char* text; По ходу выполнения программы необходимо реализовать запись в эту переменную, т.е. работает как стек, в который все только входит. На сколько я знаю функция объединения - strcat(); мне нужно с помощью нее объединять text и новые данные или использоват другой механизм? И как увеличивать длинну переменной text? В принципе, по-моему, это вообще невозможно, увеличить размер переменной после ее инициализации, наверное я очень сильно ошибаюсь. И еще примерно таже проблема с памятью, как прочитать файл в память? Точнее как определить размер файла?
Спасибо!
Работа с памятью для новичка в Си
Модератор: Модераторы разделов
-
Kasper_WPS
- Сообщения: 312
- ОС: Gentoo
Работа с памятью для новичка в Си
Gentoo Linux - Stage1 - Core2 Q6600 Quad - 2008.0
Kernel: Gentoo-sources - 2.6.36 GCC 4.5.1
XOrg-server 1.9.2 (NVIDIA-9600GT), KDE4 4.5.4
Kernel: Gentoo-sources - 2.6.36 GCC 4.5.1
XOrg-server 1.9.2 (NVIDIA-9600GT), KDE4 4.5.4
-
halturin
- Сообщения: 167
- ОС: Linux
Re: Работа с памятью для новичка в Си
тогда уж лучше списками наверное воспользоваться (это я про а-ля стек).
еже ли хочешь про выделение памяти почитать, то man malloc (там есть описание про realloc), но в твоем случае это больше напоминает костыль к решению задачи. вообще, операции выделения и уж тем более реаллоцирования - слишком дорогостоящее занятие.
про определение размера - это тебе в сторону man fstat и иже с ними
терзай
еже ли хочешь про выделение памяти почитать, то man malloc (там есть описание про realloc), но в твоем случае это больше напоминает костыль к решению задачи. вообще, операции выделения и уж тем более реаллоцирования - слишком дорогостоящее занятие.
про определение размера - это тебе в сторону man fstat и иже с ними
терзай
-
v04bvs
- Сообщения: 636
- ОС: Debian GNU/Linux
Re: Работа с памятью для новичка в Си
Во-первых переменные не принято описывать в заголовочных файлах. Надо делать так:
main.h
extern char *text;
main.c
char *text;
Иначе будут ошибки при сборке, если файл main.h включается более чем в 1 с-файл.
Да, это невозможно.
В общих словах алгоритм выглядит так: выделить новый участок памяти достаточно большого размера, скопировать туда старый, старый освободить, дописать что надо, присвоить старому указателю новый. Можно выделять сразу с запасом, чтобы на несколько дописываний хватило, в общем есть поле для размышлений.
Для того, чтобы выполнить цикл "выделить новую память, скопироть старую, освободить старую", существует функция realloc.
Есть стандартные функции. Точно не помню, кажется надо сделать seek в конец файла и получить текущую позицию указателя. Это на "чистом" С. Если POSIX, например Linux, можно использовать вызовы stat. Это насчёт определения размера. Считать файл несложно с помощью стандартных функций.
main.h
extern char *text;
main.c
char *text;
Иначе будут ошибки при сборке, если файл main.h включается более чем в 1 с-файл.
В принципе, по-моему, это вообще невозможно, увеличить размер переменной после ее инициализации, наверное я очень сильно ошибаюсь.
Да, это невозможно.
В общих словах алгоритм выглядит так: выделить новый участок памяти достаточно большого размера, скопировать туда старый, старый освободить, дописать что надо, присвоить старому указателю новый. Можно выделять сразу с запасом, чтобы на несколько дописываний хватило, в общем есть поле для размышлений.
Для того, чтобы выполнить цикл "выделить новую память, скопироть старую, освободить старую", существует функция realloc.
И еще примерно таже проблема с памятью, как прочитать файл в память? Точнее как определить размер файла?
Есть стандартные функции. Точно не помню, кажется надо сделать seek в конец файла и получить текущую позицию указателя. Это на "чистом" С. Если POSIX, например Linux, можно использовать вызовы stat. Это насчёт определения размера. Считать файл несложно с помощью стандартных функций.
-
Liksys
- Сообщения: 2910
Re: Работа с памятью для новичка в Си
Отображение файлов в память: man mmap