В прошлом уроке мы разобрали работу с файлами,домашним заданием у вас было написать своё шифрование файлов.Если у вас с этим были трудности-предлагаю вам поработать по этому плану:
Создать буфер
Программа запрашивает расположение файла
Программа запрашивает файл для сохранения
Если файл успешно открыт
Считать содержимое файла в буфер
Пока элементы буфера не закончатся
Изменить элемент
Записать элемент в новый файл
Вывод сообщения об записи
Уверен,у вас получится.
Теперь давайте поговорим об динамической памяти.Представьте себе обычный массив,он,как правило фиксирован на время выполнения программы,а теперь представьте себе что этот массив способен меняться в течении работы программы.Здорово,правда? Такое даже пригодилось бы в нашей программе по шифрованию.
Ещё пара слов об динамической памяти и приступим к практике.Динамическая память хранится в так называемой "куче",просто ещё один сегмент "виртуальной" оперативной памяти.Константы,которые мы рассмотрели так же в предыдущем уроке-так же хранятся в отдельной области.
Выделение динамической памяти происходит следующим образом:
1)Создаётся указатель
2)По указателю выделятся сегмент по его адресу
3)Сегмент резервируется под ваш размер
Теперь приступим к практике.
Необходимые нам функции находятся в библиотеке stdlib.h,не забудьте её подключить.
Первая функция-это malloc,принимает число байт и возвращает указатель.Следующая функция - free,принимает указатель,просто освобождает память.
Примеры:
void main()
{
char *string=malloc(126);//вернуть 126 байт
free(string);
}
Я не рекомендую пользоваться malloc,потому как если вы получите вывод с такого указателя-вероятно у вас там будет мусор.А если у вас получена строка меньше,чем размер нашего массива? В таком случае-ожидайте чего-то неожиданного.Не самая лучшая перспектива.Исправить это можно забив нулями весь массив,но кому нужно делать отдельные вызовы или циклы.
Давайте сэкономим время и просто используем функцию calloc.Она принимает число байт и шаг,как правило шаг равен единице,и конечно же возвращает указатель:
void main()
{
char *string=calloc(126,1);
free(string);//эту память тоже желательно очищать
string=calloc(256,1);/раз уж очистили-выделим новую
free(string);
}
В заключение скажу ещё пару слов об очистке памяти-хорошей практикой считается очистка памяти в конце программа,да,она автоматически освобождается после завершения программы,но лучше контролировать процесс.Домашнее задание: переписать программу по шифрованию с динамической памятью.Всего доброго!