Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 5.00/14: Рейтинг темы: голосов - 14, средняя оценка - 5.00
2 / 2 / 0
Регистрация: 15.01.2012
Сообщений: 181
1

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

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

Доброго времени суток.
Чтобы выделить память под двумерный массив в такой форме:
C++
1
2
3
//n - переменная, M - константа
arr = new double [n][M];
...
как должно выглядеть объявление указателя arr?
P.S. Нужно выделить память для массива с помощью одного оператора new.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.11.2012, 19:46
Ответы с готовыми решениями:

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

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

Выделение памяти.
Значит так.Задача такая. Ввести строки или строку символов. Сколько мы будем вводить символов...

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

20
Don't worry, be happy
17166 / 10050 / 1934
Регистрация: 27.09.2012
Сообщений: 25,040
Записей в блоге: 1
12.11.2012, 19:54 2
Цитата Сообщение от PG94 Посмотреть сообщение
как должно выглядеть объявление указателя arr?
указатель на указатель
C++
1
double **arr;
только так Вы память не выделите.
0
433 / 368 / 149
Регистрация: 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
3413 / 2772 / 751
Регистрация: 25.03.2012
Сообщений: 10,080
Записей в блоге: 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
433 / 368 / 149
Регистрация: 06.08.2012
Сообщений: 961
12.11.2012, 20:29 5
Kuzia domovenok, ок, а разве мой вариант не подходит?
0
Don't worry, be happy
17166 / 10050 / 1934
Регистрация: 27.09.2012
Сообщений: 25,040
Записей в блоге: 1
12.11.2012, 20:32 6
Цитата Сообщение от SeregaC++ Посмотреть сообщение
Kuzia domovenok, ок, а разве мой вариант не подходит?
Разные способы выделения памяти и "установки" указателей

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

Не по теме:

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

0
433 / 368 / 149
Регистрация: 06.08.2012
Сообщений: 961
12.11.2012, 20:38 9
Цитата Сообщение от Croessmah Посмотреть сообщение

Не по теме:


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

Не по теме:

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

0
3 / 3 / 1
Регистрация: 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
Don't worry, be happy
17166 / 10050 / 1934
Регистрация: 27.09.2012
Сообщений: 25,040
Записей в блоге: 1
13.11.2012, 17:24 11
Попробуйте расписать цикл в линейку и станет ясно что и как
0
3 / 3 / 1
Регистрация: 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
Почетный модератор
7385 / 2629 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
13.11.2012, 17:51 13
Eugine, не понял, что ты написал.
Создаем непрерывную область памяти для всех элементов - n*m размер. Она линейна. a[0] выставляем на начало это области. На что следующий указатель? На адрес начала + смещение равное кол-ву элементов в строке. то есть a[1] = a[0]+m. на что следующий? на адрес предыдущего плюс, смещение то же самое, a[2] = a[1]+m.
Так понятнее?
1
Don't worry, be happy
17166 / 10050 / 1934
Регистрация: 27.09.2012
Сообщений: 25,040
Записей в блоге: 1
13.11.2012, 17:56 14
a[0] указывает на линейный массив 3*3
a[1] указывает на a[0]+3 (на следующее измерение массива)
a[2] указывает на a[1]+3
Получается следующее:
Выделение памяти
1
3 / 3 / 1
Регистрация: 10.11.2012
Сообщений: 63
13.11.2012, 17:58 15
Большое спасибо, полностью разобрался.
0
3413 / 2772 / 751
Регистрация: 25.03.2012
Сообщений: 10,080
Записей в блоге: 1
13.11.2012, 18:04 16
Цитата Сообщение от Eugine Посмотреть сообщение
Поправте меня если я не прав.
Создаем массив 3х3.
а[0] указывает на массив размера N*N (N=3).
a[1] указывает на массив размера N*N - N.
a[2] на массив N*N-2N = 3.
Я правильно понял?
Вообще-то нет. То есть формально ты прав, мы можем по указателю a[0] записать массив N*N, но идея была, в том, что указатели a[0], a[1], a[2]... "отмеряют" в массиве куски равной длины, которые используются только в качестве массива. в пределах не от 0 до N*N, а от 0 до N
То есть ты можешь без порчи памяти записать a[0][7] в массив 3*3, но это будет нарушать всю нашу логику, т.к. этот элемент затрёт a[2][1], т.к. 7=2*N+1

Добавлено через 30 секунд
Цитата Сообщение от Croessmah Посмотреть сообщение
a[0] указывает на линейный массив 3*3
a[1] указывает на a[0]+3 (на следующее измерение массива)
a[2] указывает на a[1]+3
Получается следующее:
Вложение 200589
О! как раз думал где б нарисовать!
1
2 / 2 / 0
Регистрация: 15.01.2012
Сообщений: 181
13.11.2012, 20:43  [ТС] 17
Спасибо за ответы, но разъясните пожалуйста ещё один момент: как понимать данный текст(вырезка из книги "Visual C++ 2010: полный курс")?
0
Миниатюры
Выделение памяти  
3413 / 2772 / 751
Регистрация: 25.03.2012
Сообщений: 10,080
Записей в блоге: 1
13.11.2012, 20:49 18
Цитата Сообщение от PG94 Посмотреть сообщение
Visual C++ 2010: полный курс
название говорит само за себя. Готов спорить, пол книги там обсуждается, какие новые кнопочки и менюшки появились в Visual C++ 2010 по сравнению с Visual C++ 2008
0
Don't worry, be happy
17166 / 10050 / 1934
Регистрация: 27.09.2012
Сообщений: 25,040
Записей в блоге: 1
13.11.2012, 21:29 19
Цитата Сообщение от PG94 Посмотреть сообщение
как понимать данный текст(вырезка из книги "Visual C++ 2010: полный курс")?
лучше пропустите
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Готов спорить, пол книги там обсуждается
есть и такое, но там больше как-то про язык C++ и C++/CLI. А еще там трехмерные массивы таким же способом выделяются
0
2 / 2 / 0
Регистрация: 24.01.2014
Сообщений: 42
24.01.2017, 21:40 20
Croessmah вы наверное имели ввиду вот такой масив!!!

C++
1
2
3
4
5
6
7
8
9
n = 10; m = 20;
 
int Mas* = new int[n*m]; //создаем необходимое число ячеек
 
// а навигация по такому массиву выглядит так (для примера заполним массив единицами)
for (int i = 0; i < n; ++i)
     for (int j = 0; i < m; ++j)
           Mas[n*i + j] = 1;
//это самое быстрое выделение памяти и навигации
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.01.2017, 21:40

Выделение памяти
В чём ошибка выделения памяти? Подскажите, друзья! #include &quot;stdafx.h&quot; #include &quot;stdio.h&quot;...

Выделение памяти
Во время выполнения программы после ввода нескольких символов выводит ошибку: double free or...

выделение памяти
#include &lt;iostream&gt; using namespace std; class Matrix { int m, n; public: float **M;...

Выделение памяти
Всем доброго времени суток! Пытаюсь сделать связанный список на 100кк элементов, но не выделив...


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

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

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