[英]initialize struct of C
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
您正在返回一个指向本地数据的指针,这是错误的形式,不起作用。
您可能应该调用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;
}
(正如MM所指出的,我还修复了循环边界。)
i < num_cols
应该是i < num_rows
。
当前,您的代码返回一个局部变量的地址。 函数返回时,局部变量将被销毁,因此实际上您返回的是悬空指针,不是一个好主意。
相反,您应该返回局部变量的副本。 从函数原型和M
声明中删除*
,并从return
语句中删除&
。
除非它很大,否则我将使用:
#define M 3
#define N 3
int matrix[M][N]={{0,0,0},{0,0,0},{0,0,0}};
/* above possibly static */
简单!
如果矩阵很大,则使用for循环进行初始化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.