Перейти к содержимому

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

  • автор:

Увеличение размера динамического массива через функцию

Имеется динамический массив чаров. Функция increase принимает указатель на массив, его размер, желаемый новый размер. Функция должна копировать старый массив в новый, но с «желаемым размером», потом возвращать указатель на новый массив. Только сейчас начал осваивать указатели и столкнулся с такой проблемой, что наличие строчек
delete arr;
arr = nullptr;
, которые, как предполагалось, должны были чистить память, на который указывал старый указатель, но они каким то образом воздействуют на новый указатель, из за чего цикл, который выводит массив нового указателя выводит не то, что нужно. Как это исправить?
2. Я где то читал, что лучше не делать указатели на локальные массивы (Возможно я что то путаю). В любом случае, как переделать функцию, что бы она возвращала весь новый массив?
3. Можно ли как то переделать этот код так, что бы вместо динамического массива чаров была динамическая строка string, размер которой так же можно менять через функцию?
p.s. я новичок, так что, пожалуйста, слишком сложный код не отправляйте). Буду оочень благодарен за ответы.

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
#include using namespace std; char increase(char* arr, int size,int newSize) { char* newArr = new char[newSize]; for (int i = 0; i  size; i++) { newArr[i] = arr[i]; } delete arr; // arr = nullptr; // return *newArr; } int main() { setlocale(LC_ALL, "Russian"); int size = 10; char* arr = new char[size]; for (int i = 0; i  size; i++) { arr[i] = 's'; cout  + 1  <". "  [i]  ; } cout  <"////////////////////////////////////"  ; *arr=(increase(arr,size,12)); arr[10] = 'w'; arr[11] = 'w'; for (int i = 0; i  size+2; i++) { cout  + 1  <". "  [i]  ; } system("pause"); system("cls"); main(); }

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

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

2 окт 2017 в 16:54

1 ответ 1

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

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

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

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

Отслеживать
ответ дан 2 окт 2017 в 16:46
Voidificator Voidificator
1,973 7 7 серебряных знаков 7 7 бронзовых знаков

  • c++
  • c
  • массивы
  • строки
  • динамические-массивы
    Важное на Мете
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.10.27.43697

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

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

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

*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; }

Увеличение динамического массива в С++

Возникла проблемка которая не дает мне спокойствия. Суть такова, есть указатель на целое int *a;Затем выделяем память, а=new int[10]; потом, заполнили его в цикле числами. И тут мне надо еще добавить ячеек в массив а, что бы туда записать числа, можно конечно через временный массив но мне не хотеться. Когда так делаю а=new int[20]; то вся информация что была раньше исчезает. Как увеличить массив без потери данных? Заранее спасибо!
Пример

int *a;
a =new int [10];

a=new int [20];//тут вся информация исчезает

11 ответов

01 ноября 2007 года
1.0K / / 08.01.2007
Используй вектор.

int _tmain(int argc, _TCHAR* argv[])
vector coll;
for(int i = 0;i < 10;++i)
coll.push_back(i);
coll.push_back(10);
coll.push_back(22);
for(int i = 0;i < coll.size();++i)
cout cout return 0;
>

02 ноября 2007 года
68 / / 01.11.2007

m_Valery cпасибо что откликнулся и сразу же вопрос. В vector –е можно использовать структуры(vector), просто я привел простейший пример, а мне надо массив структур увеличивать. Как с этим быть?

02 ноября 2007 года
277 / / 11.10.2006
естественно можно:-)
struct sHosts
string hostname;
string nserver;
string devid;
string fixaddr;
>;
vectorhosts;
02 ноября 2007 года
2.5K / / 14.07.2006

Можно исспользовать любой тип. Главное чтобы для него были определенны оператор присваивания и конструктор копирования.

Ну или можно исспользовать указатель на тип (который сам по себе тип но у него есть оператор присваивания). ))

02 ноября 2007 года
1.1K / / 19.09.2006
Когда так делаю а=new int[20]; то вся информация что была раньше исчезает.

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

// выделяем блок памяти под 10 элементов размером с int (4*10 байт)
int *array = (int*) malloc (10 * sizeof (int));
// изменяем размер блока выделенной памяти
array = (int*) realloc (array, 20 * sizeof (int));
// освобождаем память
free (array)

При увеличении блока, функция может выполнить перемещение данных в бо’льшую область памяти.
Данные функции не обнуляют выделенную память и не вызывают ни конструкторы, ни деструкторы (в отличие от new[] и delete[]) — поэтому их очень сложно использовать для сложных типов..

03 ноября 2007 года
68 / / 01.11.2007
Всем спасибо помогли хорошенько
27 августа 2010 года
2 / / 27.08.2010

Я постоянно работаю с динамическими массивами в Object Pascal и PHP. Вот внезапно возникла необходимость использования языка C++ и пришлось немного почесать голову )). :confused:

Библиотека это конечно хорошо, но почему изменение длины массива не реализовано в стандартной библиотеке. А ведь C++ самый успешный и развивающийся язык программирования.

Учитывая тот факт что в С++ можно объявить массив где угодно в теле алгоритма, то преимущества динамического массива сужаются к двум:
1. можно создавать (суб)подмассивы произвольной длинны (в принципе существенный фактор);
2. тут же удалить массив из памяти после выполнения необходимых операций (не дожидаясь конца функции и т.п.).

А для Object Pascal преимущества динамического массива увеличиваются как минимум на два:
3. не занимает памяти, пока массив не востребован, т.е. не задана длинна (большой бонус, поскольку переменные объявляются только в разделе var и занимают память от начала алгоритма);
4. можно сколь угодно удлинять и укорачивать массив без потери данных в пределах усечения ( пример SetLength(Massiv, 1) ).

Резонные вопросы:
1. может Object Pascal хитрит, т.е. метод SetLength создает второй массив новой длины и копирует данные с первого и переписывает указатель?
2. или забросили и недоделали данную операцию в С++ поскольку была библиотека (бред какой-то)? 😮

Ответы на свои вопросы искал заранее, но нигде ничего не нашел. Может Вы, где что видели или знаете? Заранее благодарен. :rolleyes:

27 августа 2010 года
452 / / 12.08.2009

шаблонный класс vector находится в STL, что расшифровывается как Standart Template Libraty(стандартная библиотека шаблонов).

1. может Object Pascal хитрит, т.е. метод SetLength создает второй массив новой длины и копирует данные с первого и переписывает указатель?

я Паскале я не силён. но подозреваю что скорее всего неявно производится выделение новой памяти(при расширении массива) и перенос массива туда.
вообще говоря, нельзя просто так нарастить длинну массива, потому что элементы любого массива располагаются в памяти последовательно, а гарантий того, что последующие ячейки памяти не будут заняты — нет.

2. или забросили и недоделали данную операцию в С++ поскольку была библиотека (бред какой-то)?

C++ — это использование STL для работы с контейнерами.
операции new и delete растут из Си с malloc и free

в vector расширение памяти под хранимые объекты можно производить как явно, так и не явно, так что всё есть в C++

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

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