2016-02-18 25 views
0

我試圖讀取矩陣,如下所示: 我已經在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。我在這裏錯過了什麼?

+1

'ptr =(int **)malloc(A-> m * A-> n * sizeof(int));'?你爲什麼要分配'sizeof(type)'並且期望將它用作'type **'?避免這種情況的一種方法是'ptr = malloc(A-> m * A-> n * sizeof(* ptr));',它自動執行正確的操作。 – EOF

+0

嘗試'ptr =(int **)malloc(A-> m * A-> n * sizeof(int **));' – hagrawal

+3

@hagrawal:不。 – EOF

回答

2

單個指針就是正在使用的分配所需的全部指針。

#include <stdio.h> 
#include <stdlib.h> 

typedef struct _Matrix { 
    int *data;   //single pointer 
    int m; 
    int n; 
} Matrix; 

Matrix *read_matrix(void) { 
    Matrix *A; 
    int i, j; 

    A = malloc(sizeof(Matrix)); 
    if(A == NULL) { 
     return NULL; 
    } 

    printf("Enter m : "); 
    scanf("%d", &A->m); 
    printf("Enter n : "); 
    scanf("%d", &A->n); 

    A->data = malloc(A->m * A->n * sizeof(int)); 
    if(A->data == NULL) { 
     return A; 
    } 
    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", &A->data[(j * A->m) + i]); 
     } 
    } 
    return A; 
} 

int main() { 
    Matrix *A; 
    int i; 
    int j; 

    A = read_matrix(); 
    if (A) { 
     if (A->data) { 
      for(i=0; i<A->m; ++i) { 
       for(j=0; j<A->n; ++j) { 
        printf("A[%d][%d]= %d\n", i, j, A->data[(j * A->m) + i]); 
       } 
      } 
      free(A->data); 
     } 
     free(A); 
    } 
    return 0; 
} 
+0

這個代碼在輸入'm = 3,n = 1'處似乎有問題。它崩潰如下:'在005E1508處的堆塊在005E151C修改爲過去請求的c'的大小。根據我的理解,運營商優先權可能不是導致此問題的原因。會是什麼呢? – user2338150

+1

謝謝你指出。我犯了同樣的錯誤。這裏的索引順序是「Column-Major」。我錯誤地把它當作'Row-Major'。對於'Row-Major',應該使用'A-> data [i * A-> n + j]'。 – user2338150