10.27 Память на куче
Повторение:
Бывает по-разному, но обычно у запущенной программы в ОС:
- ↓ стек
- недоступная память
- ↑ куча
- статическая память
Почему так? Так пошла эволюцияПотому что!!! (+потому что виртуальная память, а так удобнее)
strlen, strlcpy и strlcat: ввести число n и строку, сформировать и вывести строку, повторенную n раз
NB! Вот здесь начали сильно тормозить из-за отсутствия нормальных падаванок
Тип void * и двойные ссылки; malloc() и calloc()
Был ли void * на лекциях? Для чего нужен?
Написать функцию char *strmul(char *str, int mul), которая заказывает память для результата и возвращает строку str, повторенную mul раз
Тип int ** и ему подобные — для чего нужны?
Подсказка: все параметры передаются в функцию по значению
Преобразовать strmul() в функцию strmulinput(char **dst, int *size, int mul), которая вводит строку (не длиннее 100), формирует строку ввода, повторенную mul раз, и помещает указатель на строку и размер в dst и size. Вывести *dst и *size Попробовать добавить наш любимый -fsanitize=address
А вот! free
Кто маллочит — тот и фрит!
realloc: «увеличение» выделенного буфера
это не увеличение! (иногда!) выделяется новый (больший) буфер, в него копируется старый, старый уходит в free(), возвращается новый
Почему «иногда»? Так пошла эволюцияПредположительно, потому что ОС в действительности выделила больший буфер
Написать функцию char *getlines(int n), которая вводит n строк в одну (\n удалять не надо), возвращая указатель на эту многострочную строку. Проверить, всё ли в порядке с -fsanitize=address Подсказка: fgets() → realloc() → strcat() и так по кругу
NB! Это было только в режиме быстрой малопонятной падаванки
Ввод строки произвольного размера
Работа getline
Ввод строки произвольного размера (для этого надо инициализировать приёмник NULL-ом)
(требуется free()):
⇒ Если s != NULL, а вводимая строка больше bufsize, произойдёт realloc()
Переписать getlines() с использованием getline(). Проверить, всё ли в порядке с -fsanitize=address
NB! Досюда не дошли, но это хотя бы несложно
Массив строк
Инициализированный массив строк
Ввести n, затем создать массив на n строк и ввести их; вывести только строки, в которых содержится первый символ последней строки (strchr) Не забыть free() для них для всех!
Д/З (можно делать)
Поиск с заменой. Ввести три cлова — s, a и b. Вывести строку s, в которой все вхождения a будут заменены на b. Повторную замену (в случае, когда после замены образуются новые вхождения) делать не надо.
Поиск и замену вести в один проход среди найденных вхождений a в s в порядке от начала к концу. Например, при s="11111", a="11", b="2" результатом замены должно быть "221".
Нет повторной замены: "aba" → "ca" в строке "ababa". Вхождение aba в ababa одно (за первым aba следует только ba) ⇒ результат поиска с заменой — "caba".
xqwedfqweasadsadfaqweqwesdf qwe RTYS
→xRTYSdfRTYSasadsadfaRTYSRTYSsdf
- Ввести две строки длиной не более 100 символов, вывести их наиболее длинную общую подстроку. Если таких подстрок несколько, вывести ту, что следует раньше в первой строке. Если общих подстрок нет, вывести "FAIL".
01uj12qawsed23tgyhej34 uj-tgyhej-qawsed
→qawsed
Ввести последовательность «плюсфрагментов» — цепочек произвольных символов, разделённых символом '+'. Несколько символов-разделителей подряд в строке быть не может. Вывести только фрагменты, целиком состоящие из латинских гласных a, e, i, o, u. Внутри фрагмента могут встречаться пробелы и переводы строки. Совет: getdelim и strspn
qwe+aeuio+sd f+aeeug+ae
→aeuio ae
- Ввести массив строк и отсортировать их по количеству запятых любым алгоритмом устойчивой сортировки. Вывести отсортированные строки, каждую на своей строке экрана.
- Алгоритм устойчивой сортировки сохраняет исходный порядок среди элементов, имеющих одинаковое значение критерия сортировки. Годится «пузырёк».
Поскольку массив строк это массив элементов типа char *, то чтобы поменять местами строки в массиве, достаточно поменять местами указатели на них.
- Не следует каждый раз заново считать для строки значение ключа (количество запятых). Заведите массив ключей, заполните его, и переставляйте его элементы одновременно с перестановкой элементов массива строк.
October 2026 Su Mo Tu We Th Fr Sa 1 2 , 4 5 6 7 8 9 10 11 12 1, 14 15 16 17 18 19 20 21 22 2, 24 25 26 27 28 29 ,0 ,1→October 2026 Su Mo Tu We Th Fr Sa 4 5 6 7 8 9 10 1 2 , 11 12 1, 14 15 16 17 18 19 20 21 22 2, 24 25 26 27 28 29 ,0 ,1Обратите внимание на то, что во входных данных есть пустая строка, которая содержит только '\n', — она учитывается и выводится четвёртой
