powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Выделение памяти для N размерного массива.
25 сообщений из 33, страница 1 из 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
25 сообщений из 33, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Выделение памяти для N размерного массива.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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