Задача на динамическое выделение памяти. Изначально есть указатель на массив с одним элементом. Пользователь вводит число. Если оно больше 0 записываем его в массив. Далее пользователь вводит второе число, тут уже, если оно больше 0, надо пере выделять память для 2-х элементов массива и записать в массив второе число. И так далее… для 3-х элементов, для 4-х… пока пользователь не введет отрицательное число.
Пример работы программы:
Исходный код программы показан ниже:
#include <iostream> using namespace std; int main() { setlocale(LC_ALL, "rus"); int *p = new int[1]; int *p2;//для копирования данных из массива p перед удалением памяти int a = 0;//число, которое вводит пользователь int nSize = 0;//размер динамического массива, который будет увеличиваться на 1, при вводе положительного числа while(a >= 0){ cout << "\nВведите целое число: "; cin >> a; if(a < 0){ break;//если введено отрицательное число - break } if(nSize == 0) { p[nSize] = a; cout << p[nSize]; nSize++;//1 } else { p2 = new int [nSize + 1]; for(int i = 0; i < nSize; i++) { p2[i] = p[i];//скопировали массив } p2[nSize] = a; delete [] p; //чистим память p = new int[nSize + 1]; //выделяем новую память for(int i = 0; i < (nSize+1); i++) { p[i] = p2[i]; //копируем данные из временного массива cout << p[i] << " ";//и отображаем все его элементы на экран } delete [] p2;//чистим память временного массива nSize++;//увеличиваем на 1 } } delete [] p;//чистим память перед завершением программы return 0; }
Смотрим результат работы программы:
CppStudio.com
Введите целое число: 3 3 Введите целое число: 4 3 4 Введите целое число: 5 3 4 5 Введите целое число: 6 3 4 5 6 Введите целое число: 7 3 4 5 6 7 Введите целое число: 8 3 4 5 6 7 8 Введите целое число: 5 3 4 5 6 7 8 5 Введите целое число: 4 3 4 5 6 7 8 5 4 Введите целое число: 0 3 4 5 6 7 8 5 4 0 Введите целое число: 0 3 4 5 6 7 8 5 4 0 0 Введите целое число: 7 3 4 5 6 7 8 5 4 0 0 7 Введите целое число: -1
Комментарии
Lee Amstrong
Вот. Запилил без копирования памяти (за некоторыми оговорками). Кратко опишу как работает. Выделяем кусок памяти n-байт, столько, что бы хватило для одного числа. При записи, проверяем, если наш кусочек заполнен, то выделяем еще.
В чем отличие от метода, который приведен в решении. Там, если закончилось место, то выделяется новый массив, а старый копируется туда, что как бы некоторые накладные расходы. В моем же методе, если место закончилось то к уже выделенному кусочку довыделяется еще память (по типу откусывания кусочков от палки).
Оговорка заключается в том, что если за нашей памятью память, используемая кем-то другим, или даже другим элементом нашей программы (скажем там, палку откусил кто-то другой), то идет все таки копирование в новую область памяти, но это уже забота ОС.
А еще я так и не понял как пофиксить предупреждение статического анализатора, но вроде все работает:
Alexander Trousevich
Alex Pir
Ребят помогите плиз у меня проблема из чисткой памяти, вот код (Не судите строго ,я только начинающий Вот код):
Dentchik 2016(Just Do it)
Просто и доступно , просто если бы обявили
Gosha
Многие тут допускают одну и туже ошибку.
Динамическая память не означает, что она резиновая. Сколько выделили через new, таким размером и можно пользоваться.
За границами выделенных адресов под массив, могут находится другие данные, при затирании которых, программа перестанет работать.
Просто такая программа слишком примитивна и в ней мало данных, поэтому эта проблема не проявляется, и кажется что программа работает корректно.
Чтобы увеличить динамический массив на один элемент его нужно удалить, а потом выделить заново память на один элемент больше.
Естественно перед удалением данные надо куда-то сохранить, а это приводит к необходимости завести еще один динамический буферный массив, в этом и есть смысл задачи.
Т.е. те у кого один динамический массив сразу уже не в теме.
Eduard_P
Решение несложное, комментарии писались дольше чем сам код.
Заняло 30мин.
fishb0ne