我仍然是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;
}
答案 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)
以确保不会在函数内意外更改地址。尝试修复删除功能。