如何在void函数中动态分配2d数组?

时间:2015-10-31 02:32:44

标签: c++ arrays

我仍然是C ++的新手,所以不要对我有意义。我想知道如何在void函数中初始化2维数组。

这是我的示例代码,但它为我提供了有关访问冲突位置的例外情况:

#include "stdafx.h"

void matrixInit(char***);
void matrixDel(char**);

void main(void){
    char** game=0;
    matrixInit(&game);
    matrixDel(game);
    return;
}


void matrixInit(char*** matrix) {
    matrix = new char**[3];
    for (int i(0); i < 3; i++) {
        matrix[i] = new char*[3];
        for (int j(0); j < 3; j++)
            *matrix[i][j] = '0';
    }
    return;
}

void matrixDel(char** matrix) {
    for (int i(0); i < 3; i++)
        delete[] matrix[i];
    delete[] *matrix;
    return;
}

2 个答案:

答案 0 :(得分:2)

转发 @fireant 以获取有关分配数组的帮助。在一些研究和调试器播放之后,我想出了所有这些。我希望这个解决方案能帮助将来的某个人!

#include "stdafx.h"

using namespace std;

int** matrixInit(int, int);
void matrixInit(int***, int, int);
void matrixDel(int**, int);
void matrixFill(int**, int, int);
void matrixPrint(int**, int, int);


void main(void) {
    const int rows = 3, cols = 3;
    int** game;

    matrixInit(&game, rows, cols); //Void allocation
    //game = matrixInit(rows, cols);  //Alternative allocation

    matrixFill(game, rows, cols);
    matrixPrint(game, rows, cols);
    matrixDel(game, rows);
    cout << endl << "Passed!"; //<iostream> lib required
    _getch(); //<conio.h> lib required
    return;
}


//Dynamical array allocation void function
void matrixInit(int*** matrix, int nRow, int nColumn) {
    (*matrix) = new int*[nRow];
    for (int i(0); i < nRow; i++)
        (*matrix)[i] = new int[nColumn];
}


//Dynamical array allocation pointer return function
int** matrixInit(int nRow, int nColumn) {
    int** matrix = new int*[nRow];
    for (int i(0); i < nRow; i++)
        matrix[i] = new int[nColumn];

    return matrix;
}


//Dynamical array deallocation void function
void matrixDel(int** matrix, int nRow) {
    for (int i(0); i < nRow; i++)
        delete[] matrix[i];
    delete[] matrix;
}


//Fill array void function 
void matrixFill(int** matrix, int nRow, int nColumn) {
    for (int i(0); i < nRow; i++)
        for (int j(0); j < nColumn; j++)
            matrix[i][j] = (j + 1) + (i * nRow);
}


//Print array void function
void matrixPrint(int** matrix, int nRow, int nColumn) {
    for (int i(0); i < nRow; i++)
        for (int j(0); j < nColumn; j++)
            cout << "[" << i << "][" << j << "] = " << matrix[i][j] << endl;
}

答案 1 :(得分:1)

你快到了,

void matrixInit(char*** matrix) {
    (*matrix) = new char*[3];
    for (int i(0); i < 3; i++) {
        (*matrix)[i] = new char[3];
        for (int j(0); j < 3; j++)
            (*matrix)[i][j] = '0';
    }
    return;
}

您正在传递地址matrixInit(&game),但matrix = new char**[3];正在覆盖传递的地址。因此,game中的main未指向已分配的内存。您可以编写void matrixInit(char*** const matrix)以确保不会在函数内意外更改地址。尝试修复删除功能。