Работа с памятью для новичка в Си

Модератор: Модераторы разделов

Аватара пользователя
Kasper_WPS
Сообщения: 312
ОС: Gentoo

Работа с памятью для новичка в Си

Сообщение Kasper_WPS »

Вопрос следующий, есть у меня переменная, допустим text, описанная в main.h как char* text; По ходу выполнения программы необходимо реализовать запись в эту переменную, т.е. работает как стек, в который все только входит. На сколько я знаю функция объединения - strcat(); мне нужно с помощью нее объединять text и новые данные или использоват другой механизм? И как увеличивать длинну переменной text? В принципе, по-моему, это вообще невозможно, увеличить размер переменной после ее инициализации, наверное я очень сильно ошибаюсь. И еще примерно таже проблема с памятью, как прочитать файл в память? Точнее как определить размер файла?
Спасибо!
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
Спасибо сказали:
Аватара пользователя
halturin
Сообщения: 167
ОС: Linux

Re: Работа с памятью для новичка в Си

Сообщение halturin »

тогда уж лучше списками наверное воспользоваться (это я про а-ля стек).
еже ли хочешь про выделение памяти почитать, то man malloc (там есть описание про realloc), но в твоем случае это больше напоминает костыль к решению задачи. вообще, операции выделения и уж тем более реаллоцирования - слишком дорогостоящее занятие.
про определение размера - это тебе в сторону man fstat и иже с ними :)

терзай ;)
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: Работа с памятью для новичка в Си

Сообщение v04bvs »

Во-первых переменные не принято описывать в заголовочных файлах. Надо делать так:
main.h
extern char *text;

main.c
char *text;

Иначе будут ошибки при сборке, если файл main.h включается более чем в 1 с-файл.

В принципе, по-моему, это вообще невозможно, увеличить размер переменной после ее инициализации, наверное я очень сильно ошибаюсь.

Да, это невозможно.

В общих словах алгоритм выглядит так: выделить новый участок памяти достаточно большого размера, скопировать туда старый, старый освободить, дописать что надо, присвоить старому указателю новый. Можно выделять сразу с запасом, чтобы на несколько дописываний хватило, в общем есть поле для размышлений.
Для того, чтобы выполнить цикл "выделить новую память, скопироть старую, освободить старую", существует функция realloc.

И еще примерно таже проблема с памятью, как прочитать файл в память? Точнее как определить размер файла?

Есть стандартные функции. Точно не помню, кажется надо сделать seek в конец файла и получить текущую позицию указателя. Это на "чистом" С. Если POSIX, например Linux, можно использовать вызовы stat. Это насчёт определения размера. Считать файл несложно с помощью стандартных функций.
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: Работа с памятью для новичка в Си

Сообщение Liksys »

Отображение файлов в память: man mmap
Спасибо сказали: