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

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

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

Выделение памяти для двухмерного массива внутри функции - C++

19.02.2013, 01:01. Просмотров 607. Ответов 4
Метки нет (Все метки)

Здравствуйте.
Предположим, есть код:
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <time.h>
 
using std::cout;
using std::endl;
 
const int M = 4;
const int N = 4;
 
void initMatrix( int**, int, int );
void freeMatrix( int**, int, int );
void showResultMatrix( int**, int, int );
 
int main(int argc, char *argv[]) {
 
    srand(time(NULL));
 
    int **matrix = NULL;
 
    initMatrix( matrix, M, N );
    showResultMatrix ( matrix, M, N );
    freeMatrix( matrix, M, N );
 
    return 0;
}
 
void initMatrix(int **mtrx, int m, int n ) {
    mtrx = new int *[m];
 
    for ( int i = 0; i < m; ++i )
        mtrx[i] = new int[n];
 
    for ( int i = 0; i < m; ++i )
        for ( int j = 0; j < n; ++j )
            mtrx[i][j] = rand() % 10 + 1;
}
 
void freeMatrix( int **mtrx, int m, int n ) {
    for ( int i = 0; i < m; ++i)
        delete[] mtrx[i];
    delete[] mtrx;
}
 
void showResultMatrix( int **mtrx, int m, int n) {
    for ( int i = 0; i < m; ++i ) {
        for ( int j = 0; j < n; ++j ) {
            cout << std::setw( 4 );
            cout << mtrx[i][j];
        }
        std::cout << std::endl;
    }
}
initMatrix - выделяет память под матрицу MxN;
freeMatrix - освобождает память из под матрицы MxN;
showResultMatrix - отображает матрицу MxN;

При входе в функцию showResultMatrix() и попытке вывода элементов, выпадает сегфолт.
gdb показывает, что после выхода из initMatrix() указатель на указатель "**matrix" содержит нулевой адрес (0x0).

С другой стороны, если выделять память в теле main() или выделять в initMatrix() как и в первом случае, но возвращать указатель явно через return, подобного не происходит и программа отрабатывает нормально.

С чем связано такое поведение передаваемого указателя на указатель?
Компилятор g++ 4.7.2.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.02.2013, 01:01
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Выделение памяти для двухмерного массива внутри функции (C++):

Динамическое выделение памяти внутри функции (что вернуть из функции, если не удалось выделить память?) - C++
такое дело, есть функция, которая выполняет некоторую операцию, функция при успешном выполнении должна вернуть 0, при ниудачном код...

Как правильно записать в виде функции выделение памяти для двумерного массива и ее освобождение - C++
Здравствуйте! Подскажите, как правильно записать в виде функции выделение памяти для двумерного массива и ее освобождение. ...

Выделение памяти для массива - C++
верно ли выделил память для массива если нет поправьте, заранее спасибо) class type { private: int ***p; int x, y, z; public: ...

Выделение памяти для массива - C++
Пишу такой код: int main() { int* arr1 = new int; } Всё норм. Теперь такой:

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

Выделение памяти для массива через функцию и использование этого массива - C++
Я определяю свою структуру, создаю динамический массив, где будут храниться элементы этой структуры. Есть функция которая выделяет память,...

4
Kuzia domovenok
1892 / 1747 / 119
Регистрация: 25.03.2012
Сообщений: 5,936
Записей в блоге: 1
19.02.2013, 01:04 #2
Цитата Сообщение от kaludis Посмотреть сообщение
initMatrix - выделяет память под матрицу MxN;
нет, не выделяет.

Добавлено через 2 минуты
Цитата Сообщение от kaludis Посмотреть сообщение
void initMatrix(int **mtrx, int m, int n ) {
* * mtrx = new int *[m];
Сравни с простым примером. (Опустим указатели для простоты)
C++
1
2
3
4
5
6
7
8
9
void initSomething(int some){
  some = 15;
}
int main(){
  int i=0;
  initSomething(i);
  cout<<i;//выводит 0. угадай, почему не инициализирует.
  return 0;
}
Подсказка, если ты думаешь, что указатели на месте аргумента функции изменят ситуацию...
НЕТ! Не изменят.
1
kaludis
2 / 2 / 0
Регистрация: 18.05.2012
Сообщений: 12
19.02.2013, 01:12  [ТС] #3
В вашем примере функция работает с формальным параметром, в который было скопировано значение переданной переменной.
Значит **mtrx в init Matrix() также является лишь копией реального указателя на указатель. Спасибо.
0
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
19.02.2013, 11:30 #4
C++
1
void initMatrix( int**, int, int );
замени на
C++
1
void initMatrix( int**&, int, int );
C++
1
2
3
4
5
6
7
8
9
10
void initMatrix(int ** &mtrx, int m, int n ) {
    mtrx = new int *[m];
 
    for ( int i = 0; i < m; ++i )
        mtrx[i] = new int[n];
 
    for ( int i = 0; i < m; ++i )
        for ( int j = 0; j < n; ++j )
            mtrx[i][j] = rand() % 10 + 1;
}
0
kaludis
2 / 2 / 0
Регистрация: 18.05.2012
Сообщений: 12
19.02.2013, 11:59  [ТС] #5
Уже попробовал, все как и должно быть.
0
19.02.2013, 11:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.02.2013, 11:59
Привет! Вот еще темы с ответами:

Динамическое выделение памяти для структуры в функции - C++
Объясните не могу понять. На С++ пишу совсем недавно. Суть вопроса, при первом запуске программы происходит проверка на существование...

Динамическое выделение памяти для массива - C++
Кто может помочь решить задачу. Для заданного двумерного массива из n строк и m столбцов вывести на экран следующее меню операций: ...

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

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


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

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

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