typedef struct {
int num_rows;
int num_cols;
int** data;
} BinaryMatrix;
BinaryMatrix *ConstructBinaryMatrix(int num_rows, int num_cols) {
BinaryMatrix matrix = {
.num_rows = num_rows,
.num_cols = num_cols,
.data = (int **) malloc((num_rows) * sizeof(int *)),
};
int i;
for (i = 0; i < num_cols; i++) {
matrix.data[i] = (int *) malloc(num_cols * sizeof(int));
}
return &matrix;
}
这是定义BinaryMatrix的正确方法,以及如何初始化它?
感谢您的帮助。
我收到了以下错误。
BinaryMatrix* M;
M = ConstructBinaryMatrix(2, 2);
printf("%d:%d", M->num_rows, M->num_cols);
输出为:4198012:0
答案 0 :(得分:2)
您正在返回指向本地数据的指针,这是一种糟糕的形式,并且无法正常工作。
您应该调用malloc
为BinaryMatrix结构分配空间,如下所示:
BinaryMatrix *ConstructBinaryMatrix(int num_rows, int num_cols) {
BinaryMatrix *matrix = malloc(sizeof(BinaryMatrix));
matrix->num_rows = num_rows;
matrix->num_cols = num_cols,
matrix->data = malloc(num_rows * sizeof(int *));
int i;
for (i = 0; i < num_rows; i++) {
matrix->data[i] = malloc(num_cols * sizeof(int));
}
return matrix;
}
(我也修正了循环边界,正如M.M.指出的那样。)
答案 1 :(得分:1)
i < num_cols
应为i < num_rows
。
目前,您的代码返回局部变量的地址。函数返回时会破坏局部变量,所以你实际上会返回一个悬空指针,这不是一个好主意。
相反,您应该返回局部变量的副本。从函数原型中删除*
,从M
的声明中删除,并从&
语句中删除return
。
答案 2 :(得分:-2)
除非我非常大,否则我会使用:
#define M 3
#define N 3
int matrix[M][N]={{0,0,0},{0,0,0},{0,0,0}};
/* above possibly static */
简单!
如果矩阵很大,只需使用 for 循环进行初始化。