Как увеличить динамический массив c
Перейти к содержимому

Как увеличить динамический массив c

  • автор:

Как увеличить динамический массив c

Доброе утро.
Хотел бы узнать, как в C++ менять размер динамического массива?

int *arr; arr = new int[10]; for (int i = 0; i < 10; i++) < arr[i] = i * i; printf("%d\n", arr[i]); >// и, скажем, вот тут мне нужно уменьшить его размер до 5-ти элементов.

Как видите, создаю я его БЕЗ участия malloc() и free(); использую new и delete — также хотелось бы узнать основные отличия меду двумя этими способами. Благодарю.

Последний раз редактировалось kefir; 19.06.2010 в 09:34 .
Участник клуба
Регистрация: 15.07.2008
Сообщений: 1,933
Сообщение от kefir

Доброе утро.
Хотел бы узнать, как в C++ менять размер динамического массива?

int *arr; arr = new int[10]; for (int i = 0; i < 10; i++) < arr[i] = i * i; printf("%d\n", arr[i]); >// и, скажем, вот тут мне нужно уменьшить его размер до 5-ти элементов.

Как видите, создаю я его БЕЗ участия malloc() и free(); использую new и delete — также хотелось бы узнать основные отличия меду двумя этими способами. Благодарю.

Менять его средствами C++ нельзя, в целом можно, конечно, использовать C-шную realloc, но не рекомендуется ) Единственный выход — создать массив большей длины и переписать в него существующий. malloc() и free() — стандартные функции из библиотеки C, а new/delete/new[]/delete[] — операторы языка C++. Отличия в основном проявляются при создании объектов классов, new помимо выделения памяти ещё и вызывает конструктор класса, а delete — деструктор. Собственно на этом отличия обычно и заканчиваются, многие реализации описывают new/delete на базе malloc/free

Увеличение размера динамического массива c-style строк

@HasmikGaryaka, копировать строки необязательно, можно скопировать лишь указатели. Он, ведь, хочет расширить массив, а не сделать его копию. А значит, старые указатели вполне могут перекочевать в новый массив.

2 окт 2017 в 16:54

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Да, в общем-то, все то же самое:

  • Создаете новый массив new char*[sz*2];
  • В него копируете указатели на с-строки из старого массива;
  • Убиваете старый массив;
  • Возвращаете указатель на новый массив.

Только имейте в виду: что в примере с int, что со строками, новые элементы (те, что не скопированы) остаются неинициализированными (мусор). По-хорошему их надо инициализировать.

Как увеличить размер массива в C++?

Подскажите пожалуйста примерную идею,как можно увеличить размер массива на с++.
Задача такова,что есть динамический массив,который пользователь заполняет.Далее,нужно написать функцию,которая добавляет элемент к массиву только в том случае,если этот елемент отсутствует. Написал вот такую функцию:

int* addItemToArray(int* array, int size, int newItem) < for (int i = 0; i < size; i++)< if (newItem == *(array + i))< return nullptr; >> int* newArray = new int[size + 1]; for (int i = 0; i < size; i++)< *(newArray+i) == *(array + i); >*(newArray + size + 1) = newItem; return newArray; >

Она возвращает адрес нового массива,далее пытаюсь принять этот результат:

int L,I; cout > L; int* lineArray = new int[L]; srand(time(0)); for (int j = 0; j < L; j++)< cout > I; > cout > I; while ((lineArray = addItemToArray(lineArray, sizeof(lineArray) / sizeof(lineArray[0]), 4)) == nullptr)< cout > I; >

Но он мне возвращает нулевой адрес.На сколько я понимаю,это происходит из за того,что время жизни моего нового массива заканчивается на выходе из функции. Как это побороть?

  • Вопрос задан более трёх лет назад
  • 8221 просмотр

Комментировать
Решения вопроса 1

Adamos

1. Вы сами себя путаете, используя *(array + i) вместо array[i]
2. Вы создаете новый массив, не удаляя старый. Понятно, что в лабораторной это не критично. Но если вы собрались жить с С++, то либо вам будут резать глаз такие вещи, либо учите другой язык.
3. У вас есть функция, в которую передается массив и элемент. Функция возвращает либо новый массив, либо nullptr. Это противоестественно. Функция должна возвращать ссылку на массив — а новый он или старый, можно решать вне функции. Это кажется неважным, но хороший код базируется именно на таких мелочах, а говнокод растет именно из-за того, что «здесь же и так все понятно».
4. Наконец, в программе трэш. Запрашиваются значения для массива, но они не вводятся в сам массив. В массив добавляется не введенное значение, а 4 (?). lineArray сразу же теряется, поскольку ему присваивается nullptr.

Измерение размера динамического массива

Author24 — интернет-сервис помощи студентам

Как можно изменять размер динамического массива? К примеру, сначала у меня:

*mas=new [10];
.
Ну и в процессе выполнения кода ВДРУГ понадобилось увеличить еще на несколько.
Как это сделать без буферной переменной?
Буферная переменная — это хорошо, если объекты занимают маленькое количество памяти.
Но мне нужно именно просто еще «довыделить» память для этого же массива.

Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Увелечение размера динамического массива
Добрый день! Итак, допустим есть массив: char *str = new char; Задача следующая: увеличить.

Изменение размера динамического массива
вводится числовой массив неизвестной длинны, каждое число заносится в динамический массив. using.

Определение размера динамического массива
Вопрос может не много глупый, но я подзабыл с. Считаю размер динамического массива и результат.

Определение размера динамического массива строк
Здравствуйте, столкнулся с проблемой предопределения размера массива строк. Проблема в том, что я.

2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162

использовать std::vector<>
в данном случае, ни определить размер массива, ни увеличить его невозможно

с помощью сишных функций malloc/free можно сделать realloc и увеличить массив, но со своими танцами и размера конечно никто не вернет

Регистрация: 11.10.2010
Сообщений: 35

ЦитатаСообщение от alex_x_x Посмотреть сообщение

использовать std::vector<>
в данном случае, ни определить размер массива, ни увеличить его невозможно

с помощью сишных функций malloc/free можно сделать realloc и увеличить массив, но со своими танцами и размера конечно никто не вернет

А можно подробнее о векторе? Я еще очень неопытен в программировании.
Я рассматривал вариант realloc, но мне не нравится

Эксперт С++

5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044

Лучший ответ

Сообщение было отмечено как решение

Решение

Вот вполне себе без темповой переменной в её обычном понимании — второй массив служит не для временного хранения, а фактически становится постоянным массивом и происходит лишь одно копирование. Недостаток — надо передавать не только новый размер, а ещё и старый, чтобы корректно скопировать. Но всё же надо использовать именно вектор, раз на плюсах пишете.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
#include template typename T > void my_realloc(T *&, size_t, size_t); int main() { int *arr = new int [10]; for (size_t i = 0; i  10; ++i) arr[i] = i; for (size_t i = 0; i  10; ++i) std::cout  [i]  <" "; std::cout  ::endl; my_realloc(arr, 10, 15); for (size_t i = 10; i  15; ++i) arr[i] = i; for (size_t i = 0; i  15; ++i) std::cout  [i]  <" "; std::cout  ::endl; delete [] arr; return 0; } template typename T > void my_realloc(T *&arr, size_t size, size_t new_size) { T *new_arr = new T [new_size]; size = size  new_size ? size : new_size; for (size_t i = 0; i  size; ++i) new_arr[i] = arr[i]; delete [] arr; arr = new_arr; }

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

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