簡體   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