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

Выделение динамической памяти для двумерного массива. - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 179, средняя оценка - 4.82
neske
1419 / 786 / 55
Регистрация: 26.03.2010
Сообщений: 2,689
16.04.2010, 19:26     Выделение динамической памяти для двумерного массива. #1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
 
int main()
{
    setlocale( LC_ALL,"Russian" );
 
    int N, M;
    std::cout << "Введите кол-во строк в массиве: ";
    std::cin >> N;
    std::cout << "Введите кол-во столбцов в массиве: ";
    std::cin >> M;
    int *MAS=new int [N][M];
 
    std::cout << "Первоначальный массив: " << std::endl;
    for (int i=0; i<N; i++) // заполняем массив с клавиатуры.
    for (int j=0; j<M; j++)
    {
        std::cout << "Массив["<<  i <<"]["<< j <<"]: ";
        std::cin >> MAS[i][j];
    }
    
    delete []MAS;
    system("pause");
    return 0;
}
Ошибка 1 error C2540: неконстантное выражение используется в качестве границы массива c:\visual studio 2008\projects\project1\example\example\kod.cpp
Ошибка 1 error C2540: неконстантное выражение используется в качестве границы массива c:\visual studio 2008\projects\project1\example\example\kod.cpp
Ошибка 3 error C2109: для индекса требуется массив или указатель c:\visual studio 2008\projects\project1\example\example\kod.cpp 20
Need help!
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MikeSoft
Эксперт C++
 Аватар для MikeSoft
3781 / 1765 / 85
Регистрация: 21.11.2009
Сообщений: 2,540
05.05.2010, 13:16     Выделение динамической памяти для двумерного массива. #21
Цитата Сообщение от msangel Посмотреть сообщение
у меня лично в 2008 студии возможно изменять и считывать переменные по адресу уже освобожденной памяти. разве память после удаления не перестает быть доступной?
а если остается доступной, то толку от этой чистки?
Всё правильно. Вы же вызываете оператор new и просите его выделить память для хранения указанного типа, определённого размера. Вы всего лишь получаете указатель на выделенную память.

Цитата Сообщение от msangel Посмотреть сообщение
разве память после удаления не перестает быть доступной?
а если остается доступной, то толку от этой чистки?
В этом и беда. Очистили - память стала быть доступной. Но ведь у нас имеется указатель на этот участок. Поэтому, компилятор и не следит, как он дальше используется. С таким же успехом его мог переписать, например, другой поток программы. А удаление указателя - мера предосторожности, которая в дальнейшем и запретит возможность адресации к освобождённому участку.

А вот то, что нет проверок на то, какая область была выделена - это меня тоже добивает ...
И адресация в matr[-15] - тоже
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
challengerr
42 / 35 / 2
Регистрация: 30.07.2008
Сообщений: 136
30.09.2011, 13:17     Выделение динамической памяти для двумерного массива. #22
что неправильно?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
using namespace std;
int **mas;
void func(int** mas, int x,int y)
{
int i,j;
mas = new int *[x];
for (i = 0; i < x; i++) {   mas[i] = new int [y];}
for (i = 0; i < x; i++) { for (j = 0; j < y; j++) { std::cin >> mas[i][j];}}
for (i = 0; i < x; i++) {for (j = 0; j < y; j++) {std::cout << mas[i][j];}std::cout << "\n";}
for (int i = 0; i < x; i++) {
  delete []mas[i];
}
delete []mas;
}
int main(int argc, char* argv[]) { 
int x,y,i,j;
//----------------------------------------------------------------------------
std::cout << "Введите кол-во строк в массиве: ";
std::cin >> x;
std::cout << "Введите кол-во столбцов в массиве: ";
std::cin >> y;
func(mas,x,y);
}
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
30.09.2011, 14:51     Выделение динамической памяти для двумерного массива. #23
всё правильно, но массив mas будет заполненым у вас только в функции func
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.05.2014, 12:12     Выделение динамической памяти для двумерного массива.
Еще ссылки по теме:

выделение динамической памяти для char C++
Как правильно записать в виде функции выделение памяти для двумерного массива и ее освобождение C++
C++ Выделение динамической памяти для массива точек

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

Или воспользуйтесь поиском по форуму:
KiSey
Сообщений: n/a
16.05.2014, 12:12     Выделение динамической памяти для двумерного массива. #24
Вот еще вариант, здесь операция выделения динамической памяти выполняется 2 раза, разобраться как работает предлагаю особо любопытным))
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    int x;
    int y;
    cout << "Введите количество столбцов: ";
    cin >> x;    
    cout << "Введите количество строк: ";
    cin >> y;
    int *temp = new int [x*y];
    int **mas = new int *[y];
    for(int i = 0 ; i < y ; i++)
        mas[i]=&temp[i*x];
    //обращение аналогичное обычному двухмерному массиву:
    mas[3][2] = 10;
    cout << mas[3][2] << endl;
    //и освобождение памяти соответственно....
    delete []temp;
    delete []mas;
Yandex
Объявления
16.05.2014, 12:12     Выделение динамической памяти для двумерного массива.
Ответ Создать тему
Опции темы

Текущее время: 20:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru