初始化C的结构

时间:2016-03-07 23:36:57

标签: c struct

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

3 个答案:

答案 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 循环进行初始化。