我試圖讀取矩陣,如下所示: 我已經在Cygwin和MinGW編譯器上試過了。指針取消引用順序時的分段錯誤
#include <stdio.h>
#include <stdlib.h>
typedef struct _Matrix {
int **data;
int m;
int n;
} Matrix;
Matrix *read_matrix(void) {
Matrix *A;
int i, j;
int **ptr;
A = (Matrix *) malloc(sizeof(Matrix));
if(A == NULL) {
return NULL;
}
printf("Enter m : ");
scanf("%d", &A->m);
printf("Enter n : ");
scanf("%d", &A->n);
ptr = (int **) malloc(A->m * A->n * sizeof(int));
/*-- >> A->data = ptr; << --*/
if(A->data == NULL) {
return NULL;
}
printf("\n");
for(i=0; i<A->m; ++i) {
for(j=0; j<A->n; ++j) {
printf("Enter element [%d][%d] : ", i, j);
scanf("%d", &ptr[i][j]);
}
}
A->data = ptr;
return A;
}
int main() {
Matrix *A;
A = read_matrix();
free(A->data); /* A-- A->data is NULL --*/
free(A);
return 0;
}
如果我在讀值之前設置A->data
,我得到一個SEGMENTATION FAULT
。 但是,這裏的代碼似乎沒有崩潰。但A->data
返回NULL
。我在這裏錯過了什麼?
'ptr =(int **)malloc(A-> m * A-> n * sizeof(int));'?你爲什麼要分配'sizeof(type)'並且期望將它用作'type **'?避免這種情況的一種方法是'ptr = malloc(A-> m * A-> n * sizeof(* ptr));',它自動執行正確的操作。 – EOF
嘗試'ptr =(int **)malloc(A-> m * A-> n * sizeof(int **));' – hagrawal
@hagrawal:不。 – EOF