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