Добавление дополнительной памяти к одномерному массиву, привязанному к указательной переменной

Код, от которого мы будем отталкиваться:

Создание динамических массивов в С++ происходит путём создания дополнительного массива, который заполняется значениями того массива, который предполагается расширить, после чего расширяемый массив уничтожается, а указательная переменная, используемая как массив, перенаправляется на новый сформированный массив. Это весь принцип алгоритма добавления новых ячеек памяти к массиву, если использовать new/delete. Кроме использования этого алгоритма, нужно чётко прослеживать изменения, происходящие с ячейками массива: нужен счётчик ячеек. В показанном примере в качестве счётчика выступает переменная N, которая при довыделении памяти изменяется. Чтобы изменения действовали на настоящий счётчик ячеек — в параметре функции используется ссылочный тип: int& N.
  • Динамический и динамически-создаваемый массивы — не одно и то же. Несмотря на схожие названия у этих двух сущностей есть важное отличие: к динамическому массиву в ходе работы программы можно многократно добавлять ячейки и уничтожать любые его ячейки в то время, когда динамически-создаваемый массив узнаёт количество своих ячеек в ходе работы программы один раз и этим всё ограничивается.
Немного усовершенствуем написанную программу путём добавления к массиву произвольного, указываемого нами, числа ячеек и добавлением функции обрезания ячеек в массиве:

Вы легко можете подменить функцию ввода, чтобы заполнять массив, например, вручную или случайным набором чисел. Основа, которую вы должны понять, что и в случае усечения, и в случае довыделения ячеек — мы создаём новый массив, в который переносим значения старого, а после переноса значений — старый массив обязательно уничтожается, чтобы программа не сжирала память вхолостую. К тому же, при работе с обычными функциями и указателями на массив необходимо строго прослеживать изменения, происходящие с количеством ячеек. Эта основа заложена в создание динамических массивов, т. е. массивов, число ячеек которых в ходе работы программы изменяется много раз.
Функцию memmove вы можете заменить на привычный вам цикл for, я просто не очень хотел использовать этот цикл.
Функция усечения может показаться страшноватой из-за наличия в ней всяких условий. Но эти проверки, которые в ней описаны, нужны, чтобы исключать возможное возникновение некоторых проблем: выделение памяти по отрицательному числу, копирование с выходом за границы основного массива, уничтожение большего числа ячеек, чем вообще есть ячеек в массиве. Эти ошибки легко предвидеть, поэтому лучше сразу предупредить возможный сбой программы, способный произойти из-за неправильного ввода данных.

2 комментария на «“Добавление дополнительной памяти к одномерному массиву, привязанному к указательной переменной”»

  1. Инкогнито:

    В этой строчке»(*P)[N1]=x» должно быть не N-1, а просто N

  2. Виталий:

    В функции my_realloc

    тип счетчика i    int вместо size_t

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Поиск

 
     

Случайная книга в электронном формате

https://www.litres.ru/vitaliy-potopahin/turbo-pascal-osvoy-na-primerah/?lfrom=15589587
Яндекс.Метрика