二维数组分配问题

时间:2010-06-26 18:17:59

标签: c++ multidimensional-array

这是昨天我朋友被问到的一个面试问题。问题是这样的:这个程序是否会因“访问冲突”错误而崩溃?我看了一会儿并且没有想到,它不会。但实际上在视觉工作室中尝试这一点证明我错了。我无法弄清楚这里发生了什么......或者更确切地说,我知道会发生什么,但不明白为什么。问题似乎是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 个答案:

答案 0 :(得分:4)

您正在按值传递双指针“matrix2”。因此,当matrixAlloc完成它的事情时,“matrix2”仍然是调用函数之前的任何东西。为了使填充更改​​,请考虑通过引用传递matrix2:

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

不要忘记在必要时将matrixAlloc的实现更改为取消引用矩阵。

编辑:下面的简单解决方案。改变这一行:

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

到此:

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

答案 1 :(得分:1)

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 )