powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Выделение памяти для N размерного массива.
33 сообщений из 33, показаны все 2 страниц
Выделение памяти для N размерного массива.
    #37888887
goodbenya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброе утро. Возник такой вопрос в голове. Вот к примеру у нас есть динамический массив который состоит из 10 элементов.
И создаем мы его так int *arr=new int[9]; и удаляем его delete [] arr;
Теперь возник вопрос как создать массив из N элементов для того что бы записать туда N значение чисел.Пример типа такого

int N(мы его спецом не инициализируем, так как мы не знаем какое количество элементов будет в массиве);
int *arr=new int[N];
for(int i=0;i<1000;+i)
{
arr[i]=i*2;
std::cout<<arr[i]<<" ";
}
Вот по сути эта запись вполне рабочая и компилируется....Ну ведь если N инициализированая это НЕ есть хорошо.И соответственно
при вызове
delete [] arr;//ошибка.
Поэтому хочу спросить как я могу создать массив который будет выделять для себя памяти ровно столько сколько надо и как ее удалит потом... Vector не подходит....
...
Рейтинг: 0 / 0
Выделение памяти для N размерного массива.
    #37888912
Abstraction
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goodbenya,

Давайте по порядку:
Код: plaintext
1.
int *arr=new int[9];

Мы создали динамический массив из девяти элементов. Обращение к arr[9] ("десятому" элементу) чревато непредсказуемыми последствиями.
Код: plaintext
1.
int N;

Это объявление переменной типа int - в памяти "резервируется" место под переменную, но никакого заданного значения туда не записывается. Соответственно, значение N определено (в том смысле, что в этом месте записано какое-то число), но случайно.
Код: plaintext
1.
int *arr=new int[N];

А этот код создаёт массив из N элементов. Не больше, не меньше - ровно столько, каково значение N на момент выполнения этой строки. Помимо этого (как и в первом случае) делается служебная "пометка", что блок памяти, начинающийся с адреса такого-то, имеет размер такой-то.
Код: plaintext
1.
arr[i]=i*2;

Эта инструкция эквивалентна
Код: plaintext
1.
*(arr  + i) = i*2;

То есть, берётся адрес в arr, к нему прибавляется i*sizeof(int) и в итоге получается другой адрес. По этому адресу делается попытка записать число i*2. Если мы получили адрес в пределах массива arr - всё хорошо и предсказуемо. С другой стороны, если N получилось меньше 1000, в какой-то момент мы обратимся за пределы выделенного блока. Компилятор не обязан это отслеживать, это работа программиста.
И, наконец,
Код: plaintext
1.
delete[] arr;

означает "взять служебную информацию для адреса arr, посмотреть размер выделенного блока памяти и освободить его". До тех пор, пока в arr хранится блок памяти, ранее выделенный оператором new[], такой вызов вполне корректен.
...
Рейтинг: 0 / 0
Выделение памяти для N размерного массива.
    #37888949
goodbenya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Abstraction,
Почему с 9 элементов? нумерация ведь с 0 начинается. Значить в массив arr[9] влезет 10 элементов?
И как это можно отследить ?Ведь не я на этапе компиляции не знаю сколько будет значений будет записано в массив.
Это может быть как 10 так и 100. И как выделять память для 10 элементов int *arr=new int [9] или для 100 int *arr=new int [100].
Ну проблема в том что я не знаю когда будет 10 или 100 или 324 элемента которые надо записать...
...
Рейтинг: 0 / 0
Выделение памяти для N размерного массива.
    #37888972
Abstraction
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goodbenya,

1)
Код: plaintext
1.
int *arr=new int[9];

создаёт массив на 9 элементов. Поимённо, arr[0], arr[1], arr[2], arr[3], arr[4], arr[5], arr[6], arr[7] и arr[8]. Если Вам кажется, что это не так, советую проанализировать причины этого заблуждения.

2)
Код: plaintext
1.
int *arr=new int[N];

создаёт массив из N элементов. Конкретного числа. Вообще, любое выделение динамической памяти возможно только в том случае, когда Вы знаете, сколько памяти надо. Если этой информации нет, могут быть разные варианты. Например, запросить сначала сколько-то памяти и запомнить, сколько именно запрошено; если выяснится, что запросили мало - запросить вдвое больше, скопировать имеющуюся информацию и освободить старый массив ("расширяемый массив", реализован за Вас в std::vector). Например, каждый раз запрашивать место под ещё один элемент и указатель на "следующий" ("список", "стек", "очередь" - реализованы в STL). Например, придумать/найти чего-нибудь ещё. Но команды "система-система, дай мне памяти, а сколько - я понятия не имею" не существует в природе.
...
Рейтинг: 0 / 0
Выделение памяти для N размерного массива.
    #37889078
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересно, а что по стандарту должно случится если N (в коде автора) окажется меньше нуля? А если ноль?

Что будет в:

Код: plaintext
1.
new int[N];


?
...
Рейтинг: 0 / 0
Выделение памяти для N размерного массива.
    #37889120
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav, ошибка компиляции будет.

если автор пишет на плюсах, то правильным путём будет ему использовать вектор, конечно. почему он не подходит, вот в чём вопрос. или это тот самый, которого от стл тошнит?
...
Рейтинг: 0 / 0
Выделение памяти для N размерного массива.
    #37889163
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychpetrav, ошибка компиляции будет.

Не будет ошибки при компиляции, N-то становится известно только при выполнении :)
...
Рейтинг: 0 / 0
Выделение памяти для N размерного массива.
    #37889166
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Будет исключение bad_alloc, или верется NULL если исключения отключены.
...
Рейтинг: 0 / 0
Выделение памяти для N размерного массива.
    #37889167
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ему нужна своя имплементация ::vector. Пускай закодит и живёт счастливо
Всё равно ведь С++ использует.
...
Рейтинг: 0 / 0
Выделение памяти для N размерного массива.
    #37889434
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyБудет исключение bad_alloc, или верется NULL если исключения отключены.да, верно, бес меня попутал
...
Рейтинг: 0 / 0
Выделение памяти для N размерного массива.
    #37889915
Фотография Герой дня
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Abstractionозначает "взять служебную информацию для адреса arr, посмотреть размер выделенного блока памяти и освободить его". До тех пор, пока в arr хранится блок памяти, ранее выделенный оператором new[], такой вызов вполне корректен.


а где эта служебная информация хранится ?
...
Рейтинг: 0 / 0
Выделение памяти для N размерного массива.
    #37889921
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Герой дняAbstractionозначает "взять служебную информацию для адреса arr, посмотреть размер выделенного блока памяти и освободить его". До тех пор, пока в arr хранится блок памяти, ранее выделенный оператором new[], такой вызов вполне корректен.


а где эта служебная информация хранится ?А это зависит от того какую CRT ты используешь.
Обычно, CRT создает специальный массив и в нем хранит ссылки на куски памяти и их размеры которые программа запросила через new или malloc.
А еще она может хранится и возле самого куска памяти.
А может использовать системный менеджер памяти и тогда местонахождение структура блока со служебной информацией определяется ОС и соответственно зависит от ОС.
...
Рейтинг: 0 / 0
Выделение памяти для N размерного массива.
    #37889924
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goodbenyaПоэтому хочу спросить как я могу создать массив который будет выделять для себя памяти ровно столько сколько надо и как ее удалит потом... Vector не подходит....
Ровно как и написал в начале.
new / delete
или malloc / free.

Что тебе больше нравится.
Задваться вопросами, куда new "прячет" длину выделенного блока - не твоя задача. Количество элементов у тебя в N. Что еще надо?
...
Рейтинг: 0 / 0
Выделение памяти для N размерного массива.
    #37890007
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> означает "взять служебную информацию для адреса arr, посмотреть размер
> выделенного блока памяти и освободить его". До тех пор, пока в arr хранится блок
> памяти, ранее выделенный оператором new[], такой вызов вполне корректен.

> а где эта служебная информация хранится ?

В хипе. Но это выдумки, потому что в рамках стандарта это поведение не описано.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Выделение памяти для N размерного массива.
    #37891577
Фотография Герой дня
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlГерой дняпропущено...



а где эта служебная информация хранится ?А это зависит от того какую CRT ты используешь.
Обычно, CRT создает специальный массив и в нем хранит ссылки на куски памяти и их размеры которые программа запросила через new или malloc.
А еще она может хранится и возле самого куска памяти.
А может использовать системный менеджер памяти и тогда местонахождение структура блока со служебной информацией определяется ОС и соответственно зависит от ОС.

спасибо
...
Рейтинг: 0 / 0
Выделение памяти для N размерного массива.
    #37998069
goodbenya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
egorych,вектор можно использовать и я им обошелся...ну я хочу понять как это сделать через массив...Автор при ведущего комета понял меня отлично....Сама загвоздка в том что я не знаю какой размер N задать на этапе компиляции...
...
Рейтинг: 0 / 0
Выделение памяти для N размерного массива.
    #37998078
goodbenya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Edd.Dragon, проблема в том что количество N не известная...в один момент оно может быть равно 10 а в другой момент и 10000....
...
Рейтинг: 0 / 0
Выделение памяти для N размерного массива.
    #37998173
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goodbenyaEdd.Dragon, проблема в том что количество N не известная...в один момент оно может быть равно 10 а в другой момент и 10000....
Тебе можно почитать про C++ шаблон вектор http://www.cplusplus.com/reference/stl/vector/
и про функцию realloc http://www.cplusplus.com/reference/clibrary/cstdlib/realloc/
которая к С++ шаблонам возможно и не имеет отношения но раскрывает некоторые
детали внутренней реализации растягиваемых массивов в памяти.
Обрати внимание на то что realloc может динамически двигать
массив в памяти.
...
Рейтинг: 0 / 0
Выделение памяти для N размерного массива.
    #37999115
goodbenya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton, Да да...вот теперь мы говорим о одном и том же...я тоже смотрел в сторону реалока...сейчас попробую реализовать
...
Рейтинг: 0 / 0
Выделение памяти для N размерного массива.
    #37999128
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чево там пробовать. Стандартная функция.
...
Рейтинг: 0 / 0
Выделение памяти для N размерного массива.
    #37999146
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goodbenyamayton, Да да...вот теперь мы говорим о одном и том же...я тоже смотрел в сторону реалока...сейчас попробую реализоватьrealloc не работает с массивами
...
Рейтинг: 0 / 0
Выделение памяти для N размерного массива.
    #37999151
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychgoodbenyamayton, Да да...вот теперь мы говорим о одном и том же...я тоже смотрел в сторону реалока...сейчас попробую реализоватьrealloc не работает с массивамиа не, сорри, речь идёт о динамических массивах ведь. понедельник - день тяжёлый ))) извиняюсь ))
...
Рейтинг: 0 / 0
Выделение памяти для N размерного массива.
    #38000515
goodbenya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
egorych, Блин это сообщение меня смутило...не смотря на то что я реализовал
вот пример...
{
int *mass;//создали массив
int sizeStart=1;//задали начальный размер
int countFor=rand()%100;//с имитировали неизвестное число элементов для записи
mass=(int*)malloc(sizeStart*sizeof(int));
int count=0;
for(int i=0;i<countFor;++i)
{
if (mass!=NULL)
{
mass=(int*)realloc(mass,20+(sizeStart*sizeof(int)));
sizeStart=i;
}
sizeStart++;
mass[i]=i*i;
}
for(int i=0;i<countFor;++i)
{
std::cout<<mass[i]<<" ";
}
}
...
Рейтинг: 0 / 0
Выделение памяти для N размерного массива.
    #38000521
goodbenya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
goodbenya,
правда когда я хочу узнать размер массива(sizeof(mass)/sizeof(int))...выдает 1.
...
Рейтинг: 0 / 0
Выделение памяти для N размерного массива.
    #38000530
Abstraction
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goodbenyagoodbenya,
правда когда я хочу узнать размер массива(sizeof(mass)/sizeof(int))...выдает 1.Потому что sizeof проверяет формальный тип переменной (указанный при её объявлении). То есть, sizeof(mass) эквивалентно sizeof(int*).
...
Рейтинг: 0 / 0
Выделение памяти для N размерного массива.
    #38000531
pirovindos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
int *mass; //создали указатель на int. Указатель обычно занимает 4 байта.  
...
Рейтинг: 0 / 0
Выделение памяти для N размерного массива.
    #38000533
goodbenya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
goodbenya,

как я понимаю этот не работает из за того что массив динамически...?или надо искать длину иначе
...
Рейтинг: 0 / 0
Выделение памяти для N размерного массива.
    #38000543
Abstraction
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goodbenyaegorych, Блин это сообщение меня смутило...не смотря на то что я реализовал
вот пример...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
{
int *mass;//создали массив //НЕВЕРНО! Создали указатель, сейчас он указывает к чёрту на рога
int sizeStart=1;//задали начальный размер
int countFor=rand()%100;//сымитировали неизвестное число элементов для записи
mass=(int*)malloc(sizeStart*sizeof(int));//Вот ТЕПЕРЬ создали массив под sizeStart переменных типа int
int count=0;//Неиспользуемая переменная
	for(int i=0;i<countFor;++i)
	{
		if (mass!=NULL) //А если NULL? Тогда только охнуть и закончить выполнение программы.
		{
		mass=(int*)realloc(mass,20+(sizeStart*sizeof(int)));//Место, выделенное массиву, увеличили на 20 байт (?)
		sizeStart=i;//"Размеру" массива присвоили i (на первом проходе это 0). Зачем?
		}
		sizeStart++;//Увеличили sizeStart на 1. Теперь он равен i+1.
		mass[i]=i*i;
	}
	for(int i=0;i<countFor;++i)
	{
		std::cout<<mass[i]<<"  ";
	}
}

В тег SRC не забывайте оборачивать код, пожалуйста. Замечания в комментариях. Можете объяснить, чего Вы хотели добиться каждой из строк в цикле?
...
Рейтинг: 0 / 0
Выделение памяти для N размерного массива.
    #38000552
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goodbenyaили надо искать длину иначенет возможности вычислить длину динамического массива в С. поэтому её придётся хранить, обновлять при реалоке, и таскать повсюду за собой, где у тебя используется этот массив, увы.
...
Рейтинг: 0 / 0
Выделение памяти для N размерного массива.
    #38000564
goodbenya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Abstraction,
ну ведь в случаи если так

int massStatic[10];
int sz=sizeof(massStatic)/sizeof(int);
в результате sz=10;
а если так
int *massDynamic=new int[10];
int sz=sizeof(massDynamic)/sizeof(int);
в результате sz=1;
...как же тогда узнать длину массива динамического?
...
Рейтинг: 0 / 0
Выделение памяти для N размерного массива.
    #38000593
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goodbenya...как же тогда узнать длину массива динамического?
В самом языке нет такого понятия. О длине может ведать
либо шаблон который ты используешь. К примеру тот-же vector<type>
либо отдельная переменная которую ты сам должен где-то объявить
и использовать. Так-же скорее всего поступает и шаблон.

Сам аллокатор памяти и механизмы ОС скорее всего могуть дать информацию
о длине, но это будет фейк. т.к. длина может округляться в сторону какого-то
числа. Тоесть ты аллоцировал 10 байт а фактически резеревировано другое число
параграфов, сегментов или ещё бог знает каких единиц аллокации.
Такая инфа для твоей программы - безсмысленна. Это вне плоскости алгоритма
и вне плоскости решаемой задачи.
...
Рейтинг: 0 / 0
Выделение памяти для N размерного массива.
    #38000621
goodbenya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Abstraction,
а как мне правильно сформировать первую строчку...по началу ей NULL присвоить...
типа
int mass=NULL ?
...
Рейтинг: 0 / 0
Выделение памяти для N размерного массива.
    #38001111
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goodbenyaAbstraction,
а как мне правильно сформировать первую строчку...по началу ей NULL присвоить...
типа
int mass=NULL ?я, конечно, не Abstraction, но принято делать так:
Код: plaintext
1.
int *mass=( int* )malloc( sizeStart*sizeof( int ) );

инициализируй переменные в момент их объявления где только можешь, и избавишься от целого класса ошибок навсегда
...
Рейтинг: 0 / 0
33 сообщений из 33, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Выделение памяти для N размерного массива.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]