2016-03-03 123 views
2

我無法弄清楚如何獲得與下面的代碼相同的結果,但是使用結構體。如何結合二維數組和動態內存分配使用結構體

我的目標是通過使用結構創建一個動態分配的二維數組初始化爲全零,但我不知道我在做什麼錯。我自己嘗試了很多東西,而且我在網上發現了這些東西,而且它們都不起作用。

printf("Enter the number of rows: "); 
scanf("%d", &r); 
printf("Enter the number of columns: "); 
scanf("%d", &c); 
int** list = (int**)malloc(r * sizeof(int*)); 
for (i = 0 ; i < r ; i++) { 
     list[i] = (int*) malloc(c * sizeof(int)); 
     for (x = 0 ; x < c ; x++) { 
       list[i][x] = 0; 
     } 
} 

我對結構代碼如下:

typedef struct { 
    int num_rows; 
    int num_cols; 
    int** data; 
} BinaryMatrix; 

BinaryMatrix* ConstructBinaryMatrix(int num_rows,int num_cols); 


BinaryMatrix* ConstructBinaryMatrix(int num_rows, int num_cols) { 
    if (num_rows <= 0 || num_cols <= 0) { 
      printf("Error.\n"); 
      return EXIT_FAILURE; 
    } else { 
      int i,x; 
      BinaryMatrix* A; 
      A->num_rows = num_rows; 
      A->num_cols = num_cols; 

      A->data = (int**) malloc(A->num_rows * sizeof(int*)); 

      for (i = 0; i < num_rows; i++) { 
        (A->data)[i] = malloc(A->num_cols * sizeof(int*)); 
        for (x = 0; x < A->num_cols; x++) { 
          (A->data)[i][x] = 0; 
        } 
      } 

      return A; 
    } 
} 

BinaryMatrix* M; 
printf("Enter the number of rows: "); 
scanf("%d", &num_rows); 
printf("Enter the number of cols: "); 
scanf("%d", &num_cols); 
M = ConstructBinaryMatrix(num_rows, num_cols); 

我收到的錯誤是分段錯誤。這似乎是在第一次malloc調用完成的時刻發生的。

我在學C,需要一些指導。我來自Python,所以這對我來說是新的。請幫忙,謝謝。

+1

'BinaryMatrix * A; A-> NUM_ROWS;'。那就是問題所在。 'A'是一個未初始化的變量,不能被解除引用。你首先需要爲'A'設置'malloc'內存。 – kaylum

回答

0
BinaryMatrix* A; 
A->num_rows = num_rows; 

這是你的問題;你正在解引用一個未指向的d指針。您需要先malloc a BinaryMatrix並將其分配給A以便能夠取消其字段。

BinaryMatrix* A = malloc(sizeof(BinaryMatrix)); 
+0

剛剛嘗試過,但它似乎仍然會導致分段錯誤。我換了一行:BinaryMatrix * A;進入BinaryMatrix * A = malloc(sizeof(BinaryMatrix));像你說的。 –

+0

我試過你的代碼只改變了這一行代碼(當然插入一個main()函數),對我來說工作得很好。我可以發佈下面的代碼,如果它有幫助... – petyhaker

+0

你是對的,它確實有效。我收到的分段錯誤來自其他地方,而不是這個功能。非常感謝大家。 –