繁体   English   中英

初始化C的结构

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM