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

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

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

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

19.02.2013, 01:01. Просмотров 529. Ответов 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.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.02.2013, 01:01     Выделение памяти для двухмерного массива внутри функции
Посмотрите здесь:

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

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,917
Записей в блоге: 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;
}
Подсказка, если ты думаешь, что указатели на месте аргумента функции изменят ситуацию...
НЕТ! Не изменят.
kaludis
2 / 2 / 0
Регистрация: 18.05.2012
Сообщений: 12
19.02.2013, 01:12  [ТС]     Выделение памяти для двухмерного массива внутри функции #3
В вашем примере функция работает с формальным параметром, в который было скопировано значение переданной переменной.
Значит **mtrx в init Matrix() также является лишь копией реального указателя на указатель. Спасибо.
aLarman
641 / 562 / 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;
}
kaludis
2 / 2 / 0
Регистрация: 18.05.2012
Сообщений: 12
19.02.2013, 11:59  [ТС]     Выделение памяти для двухмерного массива внутри функции #5
Уже попробовал, все как и должно быть.
Yandex
Объявления
19.02.2013, 11:59     Выделение памяти для двухмерного массива внутри функции
Ответ Создать тему
Опции темы

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