Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

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

Распределение памяти. Динамическое выделение памяти - C++
an-1 an-2 ... a2

Выделение памяти, проверка на утечку памяти - C++
Интересуют два вопроса: 1. Правильно ли устроен алгоритм выделения, удаление и запись ячейки памяти? Может быть, есть более простые...

Выделение памяти... - C++
Вот решил себе ликбез устроить и возникли вопросы: 1) Почему char* p = "fffff"; не реагирует на delete p 2) Когда надо...

Выделение памяти - C++
Скажите пожалуйста что не так? Не могу получить доступ к элементу str = 12, stlb = 3 bool** tempValues = new(bool*); for(int i = 0;...

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

выделение памяти - C++
Здравствуйте, помогите пожалуйста исправить ошибку, это лишь малая часть кода. В задании: поле name должно быть динамическим: char...

20
Croessmah
Ушел
Эксперт CЭксперт С++
13554 / 7705 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
12.11.2012, 19:54 #2
Цитата Сообщение от PG94 Посмотреть сообщение
как должно выглядеть объявление указателя arr?
указатель на указатель
C++
1
double **arr;
только так Вы память не выделите.
0
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;
0
Kuzia domovenok
1957 / 1810 / 142
Регистрация: 25.03.2012
Сообщений: 6,278
Записей в блоге: 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;
2
Issues
430 / 365 / 37
Регистрация: 06.08.2012
Сообщений: 961
12.11.2012, 20:29 #5
Kuzia domovenok, ок, а разве мой вариант не подходит?
0
Croessmah
Ушел
Эксперт CЭксперт С++
13554 / 7705 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
12.11.2012, 20:32 #6
Цитата Сообщение от SeregaC++ Посмотреть сообщение
Kuzia domovenok, ок, а разве мой вариант не подходит?
Разные способы выделения памяти и "установки" указателей

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

Не по теме:

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

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

Не по теме:


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

Не по теме:

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

0
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 - понятно. А как происходит перераспределение ячеек понять не могу.
0
Croessmah
Ушел
Эксперт CЭксперт С++
13554 / 7705 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
13.11.2012, 17:24 #11
Попробуйте расписать цикл в линейку и станет ясно что и как
0
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.
Я правильно понял?
0
Vourhey
Почетный модератор
6486 / 2260 / 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.
Так понятнее?
1
Croessmah
Ушел
Эксперт CЭксперт С++
13554 / 7705 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
13.11.2012, 17:56 #14
a[0] указывает на линейный массив 3*3
a[1] указывает на a[0]+3 (на следующее измерение массива)
a[2] указывает на a[1]+3
Получается следующее:
Выделение памяти
1
Eugine
3 / 3 / 0
Регистрация: 10.11.2012
Сообщений: 63
13.11.2012, 17:58 #15
Большое спасибо, полностью разобрался.
0
13.11.2012, 17:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.11.2012, 17:58
Привет! Вот еще темы с ответами:

Выделение памяти - C++
Вот кусок кода, класс и функция добавления в список Класс занимает 64 бита, я добавляю 10 элементов в список - 640 бит Потом отнимаю...

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

Выделение памяти - C++
Часто возникает такая проблема, когда конфигурирую проект как Release происходит ошибка выделения памяти (при вызывании new), например...

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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