Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
PG94
2 / 2 / 0
Регистрация: 15.01.2012
Сообщений: 181
#1

Выделение памяти - C++

12.11.2012, 19:46. Просмотров 2100. Ответов 20
Метки нет (Все метки)

Доброго времени суток.
Чтобы выделить память под двумерный массив в такой форме:
C++
1
2
3
//n - переменная, M - константа
arr = new double [n][M];
...
как должно выглядеть объявление указателя arr?
P.S. Нужно выделить память для массива с помощью одного оператора new.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.11.2012, 19:46     Выделение памяти
Посмотрите здесь:

Выделение памяти - C++
Здравствуйте! #include<iostream> int main() { int *mass = new int ; int *mass2 = new int ; std::cout << (unsigned int)mass <<...

До выделение памяти в С++ - C++
Всем приветик. Вообщем есть некоторые сложности с довыделение памяти... Что я хочу сделать: есть 2-х мерный массив (он ещё и квадратный)....

Выделение памяти. - C++
Значит так.Задача такая. Ввести строки или строку символов. Сколько мы будем вводить символов неизвестно.Может быть 10 а может быть...

Выделение памяти - C++
int main() { FILE *fIn = NULL, *fOut =NULL; Error EMyError; CNodeStack *Start; CNodeStack *ListF = new CNodeStack; ...

Выделение памяти - C++
Нубский вопрос, но не могу до конца разобраться. Допустим, есть простое определение переменной: int ival = 1024; Когда и как...

Выделение памяти - C++
Эта программа должна забрать у системы 10 МБ, но диспетчер задач показывает, что программа забирает 163 МБ. Почему ? ...

Выделение памяти - C++
Можно ли сделать так, чтобы в memory выделилась память для 5 int объектов, а затем раздать ее разным переменным? Пытался таким образом и...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
13052 / 7315 / 814
Регистрация: 27.09.2012
Сообщений: 18,052
Записей в блоге: 3
Завершенные тесты: 1
12.11.2012, 19:54     Выделение памяти #2
Цитата Сообщение от PG94 Посмотреть сообщение
как должно выглядеть объявление указателя arr?
указатель на указатель
C++
1
double **arr;
только так Вы память не выделите.
Issues
430 / 365 / 37
Регистрация: 06.08.2012
Сообщений: 961
12.11.2012, 20:22     Выделение памяти #3
двумерный динамический массив:
C++
1
2
3
int **arr = new int*[n];
for (int i = 0; i < n; i++) 
    arr[i] = new int[m];
Удаление:
C++
1
2
3
for (int i = 0; i < n; i++)
  delete []arr[i];
delete []arr;
Kuzia domovenok
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
12.11.2012, 20:27     Выделение памяти #4
Цитата Сообщение от SeregaC++ Посмотреть сообщение
двумерный динамический массив:
int **arr = new int*[n];
for (int i = 0; i < n; i++)
arr[i] = new int[m];
Удаление:
for (int i = 0; i < n; i++)
delete []arr[i];
delete []arr;
двумерный динамический массив:
C++
1
2
3
4
int** a=new int* [n];
a[0]=new int[n*m];
for (int i=1; i<n; i++)
  a[i]=a[i-1]+m;
Удаление
C++
1
2
delete[] a[0];
delete[] a;
Issues
430 / 365 / 37
Регистрация: 06.08.2012
Сообщений: 961
12.11.2012, 20:29     Выделение памяти #5
Kuzia domovenok, ок, а разве мой вариант не подходит?
Croessmah
Модератор
Эксперт CЭксперт С++
13052 / 7315 / 814
Регистрация: 27.09.2012
Сообщений: 18,052
Записей в блоге: 3
Завершенные тесты: 1
12.11.2012, 20:32     Выделение памяти #6
Цитата Сообщение от SeregaC++ Посмотреть сообщение
Kuzia domovenok, ок, а разве мой вариант не подходит?
Разные способы выделения памяти и "установки" указателей

Добавлено через 1 минуту
Цитата Сообщение от PG94 Посмотреть сообщение
P.S. Нужно выделить память для массива с помощью одного оператора new.
Выделите память для всех значений, а потом обращайтесь с помощью адресной арифметики
Issues
430 / 365 / 37
Регистрация: 06.08.2012
Сообщений: 961
12.11.2012, 20:32     Выделение памяти #7
Croessmah, я понял.
Croessmah
12.11.2012, 20:34
  #8

Не по теме:

Цитата Сообщение от SeregaC++ Посмотреть сообщение
Croessmah, я понял.
Просто Ваш способ во-первых, не очень эффективен для большого n и малого m, а во-вторых, у Вас массив будет "разбросан" по всей памяти.

Issues
430 / 365 / 37
Регистрация: 06.08.2012
Сообщений: 961
12.11.2012, 20:38     Выделение памяти #9
Цитата Сообщение от Croessmah Посмотреть сообщение

Не по теме:


Просто Ваш способ во-первых, не очень эффективен для большого n и малого m, а во-вторых, у Вас массив будет "разбросан" по всей памяти.

Не по теме:

Ясно. Спасибо. Я просто в интернете находил только такие методы виделения.

Eugine
3 / 3 / 0
Регистрация: 10.11.2012
Сообщений: 63
13.11.2012, 17:17     Выделение памяти #10
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
двумерный динамический массив:
C++
1
2
3
4
int** a=new int* [n];
a[0]=new int[n*m];
for (int i=1; i<n; i++)
  a[i]=a[i-1]+m;
Удаление
C++
1
2
delete[] a[0];
delete[] a;
Объясните пожалуйста как работает этот код, никак не пойму.
Ячейка а[0] указывает на массив m*n - понятно. А как происходит перераспределение ячеек понять не могу.
Croessmah
Модератор
Эксперт CЭксперт С++
13052 / 7315 / 814
Регистрация: 27.09.2012
Сообщений: 18,052
Записей в блоге: 3
Завершенные тесты: 1
13.11.2012, 17:24     Выделение памяти #11
Попробуйте расписать цикл в линейку и станет ясно что и как
Eugine
3 / 3 / 0
Регистрация: 10.11.2012
Сообщений: 63
13.11.2012, 17:46     Выделение памяти #12
Поправте меня если я не прав.
Создаем массив 3х3.
а[0] указывает на массив размера N*N (N=3).
a[1] указывает на массив размера N*N - N.
a[2] на массив N*N-2N = 3.
Я правильно понял?
Vourhey
Почетный модератор
6477 / 2252 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
13.11.2012, 17:51     Выделение памяти #13
Eugine, не понял, что ты написал.
Создаем непрерывную область памяти для всех элементов - n*m размер. Она линейна. a[0] выставляем на начало это области. На что следующий указатель? На адрес начала + смещение равное кол-ву элементов в строке. то есть a[1] = a[0]+m. на что следующий? на адрес предыдущего плюс, смещение то же самое, a[2] = a[1]+m.
Так понятнее?
Croessmah
Модератор
Эксперт CЭксперт С++
13052 / 7315 / 814
Регистрация: 27.09.2012
Сообщений: 18,052
Записей в блоге: 3
Завершенные тесты: 1
13.11.2012, 17:56     Выделение памяти #14
a[0] указывает на линейный массив 3*3
a[1] указывает на a[0]+3 (на следующее измерение массива)
a[2] указывает на a[1]+3
Получается следующее:
Выделение памяти
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.11.2012, 17:58     Выделение памяти
Еще ссылки по теме:

Выделение памяти - C++
Доброго всем вечера. В книжке нашел задание: определить класс, представляющий стек. Сделал так, что при заполнении всего стека,...

Выделение памяти (new) - C++
Наткнулся на пример где делают непонятные мне выделения памяти с помощью new X* pi = new X; X* p2 = new X ; X* рЗ = new (&amp;buffer )...

Выделение памяти - C++
Во время выполнения программы после ввода нескольких символов выводит ошибку: double free or corruption(out): 0x0000000001157010 ***...

выделение памяти - C++
есть класс множество. необходимо создать класс &quot;правило&quot;, одним из методов которого является добавление множества к соответствующему списку...

Выделение памяти - C++
Добрый вечер. Немогу никак понять некоторые тонкости выделения памяти. Во первых: на что указывает указатель, при записи char*...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Eugine
3 / 3 / 0
Регистрация: 10.11.2012
Сообщений: 63
13.11.2012, 17:58     Выделение памяти #15
Большое спасибо, полностью разобрался.
Yandex
Объявления
13.11.2012, 17:58     Выделение памяти
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru