Проблема размещения двумерных массивов - PullRequest
2 голосов
/ 26 июня 2010

это вопрос интервью, который мой друг задал вчера.Вопрос был что-то вроде: эта программа вылетит с ошибкой «нарушение прав доступа» или нет?Я смотрел на это некоторое время и думал, что нет, не будет.Но на самом деле, пробуя это в визуальной студии, я оказался неправ.Я не могу понять, что здесь происходит ... или, если быть более точным, я знаю, что происходит, но не понимаю, ПОЧЕМУ.Кажется, проблема в том, что массив matrix2 вообще не выделяется.

Код ниже:

#include <iostream>
#include <ctime>

using namespace std;

int** matrixAlloc( const int rows, const int cols );
void matrixAlloc( int** matrix, const int rows, const int cols );
void matrixDealloc( int** m, const int rows);
void matrixPrint( const int* const * const m, const int rows, const int cols );

int main( int argc, char** argv )
{   
    srand( (unsigned int)time( NULL ) );
    int** matrix1 = matrixAlloc( 4, 5 );
    matrixPrint( matrix1, 4, 5 );
    matrixDealloc( matrix1, 4 );

    int ** matrix2 = NULL;
    matrixAlloc( matrix2, 4, 5 );
    matrixDealloc( matrix2, 4 ); // <--- crash occurs here  
}

int** matrixAlloc( const int rows, const int cols )
{
    int **matrix = new int *[ rows ];
    for ( int i = 0; i < rows; i++ )
    {
        matrix[ i ] = new int[ cols ];
        for ( int j = 0; j < cols; j++ )
        {
            matrix[ i ][ j ] = (rand() * 12347) % 10;
        }
    }

    return matrix;
}

void matrixAlloc( int** matrix, const int rows, const int cols )
{
    matrix = new int *[ rows ];
    for ( int i = 0; i < rows; i++ )
    {
        matrix[ i ] = new int[ cols ];
        for ( int j = 0; j < cols; j++ )
        {
            matrix[ i ][ j ] = (rand() * 12347) % 10;
        }

    }
}

void matrixDealloc( int** matrix, const int rows )
{       
    for ( int i = 0; i < rows; i++ )
    {
        delete [] matrix[ i ];
    }
    delete [] matrix;
}

void matrixPrint( const int* const * const matrix, const int rows, const int cols )
{
    for ( int i = 0; i < rows; i++ )
    {
        for ( int j = 0; j < cols; j++ )
        {
            cout << matrix[ i ][ j ] << " ";
        }
        cout << endl;
    }
    cout << endl;
}

Ответы [ 2 ]

4 голосов
/ 26 июня 2010

Вы передаете двойной указатель "matrix2" по значению.Следовательно, когда matrixAlloc завершит свою работу, «matrix2» останется таким, каким он был до вызова функции.Чтобы получить изменение для заполнения, рассмотрите возможность передачи matrix2 по ссылке:

int** matrix2 = NULL;
matrixAlloc(&matrix2, 4, 5);
...

Не забудьте при необходимости изменить реализацию matrixAlloc на матрицу разыменования 2.

EDIT: простое решениениже.Измените эту строку:

void matrixAlloc( int** matrix, const int rows, const int cols )

на эту:

void matrixAlloc( int**& matrix, const int rows, const int cols )
1 голос
/ 26 июня 2010
matrixAlloc( matrix2, 4, 5 );

Здесь вы передаете matrix2 по значению .

void matrixAlloc( int** matrix, const int rows, const int cols )
{
    matrix = new int *[ rows ];

И здесь вы присваиваете формальный параметр.На фактический параметр, который вы передали, это не влияет.Вам, вероятно, следует передать параметр по ссылке:

void matrixAlloc( int**& matrix, const int rows, const int cols )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...