Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Выделение памяти для N размерного массива.
|
|||
|---|---|---|---|
|
#18+
Доброе утро. Возник такой вопрос в голове. Вот к примеру у нас есть динамический массив который состоит из 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 не подходит.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2012, 11:39 |
|
||
|
Выделение памяти для N размерного массива.
|
|||
|---|---|---|---|
|
#18+
goodbenya, Давайте по порядку: Код: plaintext 1. Мы создали динамический массив из девяти элементов. Обращение к arr[9] ("десятому" элементу) чревато непредсказуемыми последствиями. Код: plaintext 1. Это объявление переменной типа int - в памяти "резервируется" место под переменную, но никакого заданного значения туда не записывается. Соответственно, значение N определено (в том смысле, что в этом месте записано какое-то число), но случайно. Код: plaintext 1. А этот код создаёт массив из N элементов. Не больше, не меньше - ровно столько, каково значение N на момент выполнения этой строки. Помимо этого (как и в первом случае) делается служебная "пометка", что блок памяти, начинающийся с адреса такого-то, имеет размер такой-то. Код: plaintext 1. Эта инструкция эквивалентна Код: plaintext 1. То есть, берётся адрес в arr, к нему прибавляется i*sizeof(int) и в итоге получается другой адрес. По этому адресу делается попытка записать число i*2. Если мы получили адрес в пределах массива arr - всё хорошо и предсказуемо. С другой стороны, если N получилось меньше 1000, в какой-то момент мы обратимся за пределы выделенного блока. Компилятор не обязан это отслеживать, это работа программиста. И, наконец, Код: plaintext 1. означает "взять служебную информацию для адреса arr, посмотреть размер выделенного блока памяти и освободить его". До тех пор, пока в arr хранится блок памяти, ранее выделенный оператором new[], такой вызов вполне корректен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2012, 11:54 |
|
||
|
Выделение памяти для N размерного массива.
|
|||
|---|---|---|---|
|
#18+
Abstraction, Почему с 9 элементов? нумерация ведь с 0 начинается. Значить в массив arr[9] влезет 10 элементов? И как это можно отследить ?Ведь не я на этапе компиляции не знаю сколько будет значений будет записано в массив. Это может быть как 10 так и 100. И как выделять память для 10 элементов int *arr=new int [9] или для 100 int *arr=new int [100]. Ну проблема в том что я не знаю когда будет 10 или 100 или 324 элемента которые надо записать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2012, 12:13 |
|
||
|
Выделение памяти для N размерного массива.
|
|||
|---|---|---|---|
|
#18+
goodbenya, 1) Код: plaintext 1. создаёт массив на 9 элементов. Поимённо, arr[0], arr[1], arr[2], arr[3], arr[4], arr[5], arr[6], arr[7] и arr[8]. Если Вам кажется, что это не так, советую проанализировать причины этого заблуждения. 2) Код: plaintext 1. создаёт массив из N элементов. Конкретного числа. Вообще, любое выделение динамической памяти возможно только в том случае, когда Вы знаете, сколько памяти надо. Если этой информации нет, могут быть разные варианты. Например, запросить сначала сколько-то памяти и запомнить, сколько именно запрошено; если выяснится, что запросили мало - запросить вдвое больше, скопировать имеющуюся информацию и освободить старый массив ("расширяемый массив", реализован за Вас в std::vector). Например, каждый раз запрашивать место под ещё один элемент и указатель на "следующий" ("список", "стек", "очередь" - реализованы в STL). Например, придумать/найти чего-нибудь ещё. Но команды "система-система, дай мне памяти, а сколько - я понятия не имею" не существует в природе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2012, 12:22 |
|
||
|
Выделение памяти для N размерного массива.
|
|||
|---|---|---|---|
|
#18+
Интересно, а что по стандарту должно случится если N (в коде автора) окажется меньше нуля? А если ноль? Что будет в: Код: plaintext 1. ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2012, 13:13 |
|
||
|
Выделение памяти для N размерного массива.
|
|||
|---|---|---|---|
|
#18+
petrav, ошибка компиляции будет. если автор пишет на плюсах, то правильным путём будет ему использовать вектор, конечно. почему он не подходит, вот в чём вопрос. или это тот самый, которого от стл тошнит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2012, 13:38 |
|
||
|
Выделение памяти для N размерного массива.
|
|||
|---|---|---|---|
|
#18+
egorychpetrav, ошибка компиляции будет. Не будет ошибки при компиляции, N-то становится известно только при выполнении :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2012, 14:04 |
|
||
|
Выделение памяти для N размерного массива.
|
|||
|---|---|---|---|
|
#18+
Будет исключение bad_alloc, или верется NULL если исключения отключены. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2012, 14:08 |
|
||
|
Выделение памяти для N размерного массива.
|
|||
|---|---|---|---|
|
#18+
Ему нужна своя имплементация ::vector. Пускай закодит и живёт счастливо Всё равно ведь С++ использует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2012, 14:08 |
|
||
|
Выделение памяти для N размерного массива.
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyБудет исключение bad_alloc, или верется NULL если исключения отключены.да, верно, бес меня попутал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2012, 16:38 |
|
||
|
Выделение памяти для N размерного массива.
|
|||
|---|---|---|---|
|
#18+
Abstractionозначает "взять служебную информацию для адреса arr, посмотреть размер выделенного блока памяти и освободить его". До тех пор, пока в arr хранится блок памяти, ранее выделенный оператором new[], такой вызов вполне корректен. а где эта служебная информация хранится ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2012, 03:51 |
|
||
|
Выделение памяти для N размерного массива.
|
|||
|---|---|---|---|
|
#18+
Герой дняAbstractionозначает "взять служебную информацию для адреса arr, посмотреть размер выделенного блока памяти и освободить его". До тех пор, пока в arr хранится блок памяти, ранее выделенный оператором new[], такой вызов вполне корректен. а где эта служебная информация хранится ?А это зависит от того какую CRT ты используешь. Обычно, CRT создает специальный массив и в нем хранит ссылки на куски памяти и их размеры которые программа запросила через new или malloc. А еще она может хранится и возле самого куска памяти. А может использовать системный менеджер памяти и тогда местонахождение структура блока со служебной информацией определяется ОС и соответственно зависит от ОС. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2012, 04:14 |
|
||
|
Выделение памяти для N размерного массива.
|
|||
|---|---|---|---|
|
#18+
goodbenyaПоэтому хочу спросить как я могу создать массив который будет выделять для себя памяти ровно столько сколько надо и как ее удалит потом... Vector не подходит.... Ровно как и написал в начале. new / delete или malloc / free. Что тебе больше нравится. Задваться вопросами, куда new "прячет" длину выделенного блока - не твоя задача. Количество элементов у тебя в N. Что еще надо? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2012, 04:54 |
|
||
|
Выделение памяти для N размерного массива.
|
|||
|---|---|---|---|
|
#18+
> означает "взять служебную информацию для адреса arr, посмотреть размер > выделенного блока памяти и освободить его". До тех пор, пока в arr хранится блок > памяти, ранее выделенный оператором new[], такой вызов вполне корректен. > а где эта служебная информация хранится ? В хипе. Но это выдумки, потому что в рамках стандарта это поведение не описано. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2012, 09:18 |
|
||
|
Выделение памяти для N размерного массива.
|
|||
|---|---|---|---|
|
#18+
White OwlГерой дняпропущено... а где эта служебная информация хранится ?А это зависит от того какую CRT ты используешь. Обычно, CRT создает специальный массив и в нем хранит ссылки на куски памяти и их размеры которые программа запросила через new или malloc. А еще она может хранится и возле самого куска памяти. А может использовать системный менеджер памяти и тогда местонахождение структура блока со служебной информацией определяется ОС и соответственно зависит от ОС. спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2012, 09:18 |
|
||
|
Выделение памяти для N размерного массива.
|
|||
|---|---|---|---|
|
#18+
egorych,вектор можно использовать и я им обошелся...ну я хочу понять как это сделать через массив...Автор при ведущего комета понял меня отлично....Сама загвоздка в том что я не знаю какой размер N задать на этапе компиляции... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2012, 10:20 |
|
||
|
Выделение памяти для N размерного массива.
|
|||
|---|---|---|---|
|
#18+
Edd.Dragon, проблема в том что количество N не известная...в один момент оно может быть равно 10 а в другой момент и 10000.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2012, 10:24 |
|
||
|
Выделение памяти для N размерного массива.
|
|||
|---|---|---|---|
|
#18+
goodbenyaEdd.Dragon, проблема в том что количество N не известная...в один момент оно может быть равно 10 а в другой момент и 10000.... Тебе можно почитать про C++ шаблон вектор http://www.cplusplus.com/reference/stl/vector/ и про функцию realloc http://www.cplusplus.com/reference/clibrary/cstdlib/realloc/ которая к С++ шаблонам возможно и не имеет отношения но раскрывает некоторые детали внутренней реализации растягиваемых массивов в памяти. Обрати внимание на то что realloc может динамически двигать массив в памяти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2012, 11:17 |
|
||
|
Выделение памяти для N размерного массива.
|
|||
|---|---|---|---|
|
#18+
mayton, Да да...вот теперь мы говорим о одном и том же...я тоже смотрел в сторону реалока...сейчас попробую реализовать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2012, 18:13 |
|
||
|
Выделение памяти для N размерного массива.
|
|||
|---|---|---|---|
|
#18+
Чево там пробовать. Стандартная функция. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2012, 18:21 |
|
||
|
Выделение памяти для N размерного массива.
|
|||
|---|---|---|---|
|
#18+
goodbenyamayton, Да да...вот теперь мы говорим о одном и том же...я тоже смотрел в сторону реалока...сейчас попробую реализоватьrealloc не работает с массивами ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2012, 18:40 |
|
||
|
Выделение памяти для N размерного массива.
|
|||
|---|---|---|---|
|
#18+
egorychgoodbenyamayton, Да да...вот теперь мы говорим о одном и том же...я тоже смотрел в сторону реалока...сейчас попробую реализоватьrealloc не работает с массивамиа не, сорри, речь идёт о динамических массивах ведь. понедельник - день тяжёлый ))) извиняюсь )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2012, 18:41 |
|
||
|
Выделение памяти для N размерного массива.
|
|||
|---|---|---|---|
|
#18+
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]<<" "; } } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2012, 14:42 |
|
||
|
Выделение памяти для N размерного массива.
|
|||
|---|---|---|---|
|
#18+
goodbenya, правда когда я хочу узнать размер массива(sizeof(mass)/sizeof(int))...выдает 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2012, 14:44 |
|
||
|
Выделение памяти для N размерного массива.
|
|||
|---|---|---|---|
|
#18+
goodbenyagoodbenya, правда когда я хочу узнать размер массива(sizeof(mass)/sizeof(int))...выдает 1.Потому что sizeof проверяет формальный тип переменной (указанный при её объявлении). То есть, sizeof(mass) эквивалентно sizeof(int*). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2012, 14:47 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=37889166&tid=2020756]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
173ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
| others: | 13ms |
| total: | 275ms |

| 0 / 0 |
