2014-12-19 186 views
1

如何製作結構矩陣或指向結構的指針矩陣?矩陣a中的元素應該是Area類型的結構。C中的結構矩陣

這是我到目前爲止已經試過:

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

typedef struct { 
    char type_toy[20]; 
    int nr; 
    char town[20]; 
    char direction; 
} Area; 

void AllocMatrix(int N, int M, Area** a) { 
    int i; 
    a = malloc(N * sizeof(Area *)); 
    for (i = 0; i < N; i++) { 
    a[i] = calloc(M, sizeof(Area*)); 
    } 
} 

int main() { 
    int N, M; 
    Area** a; 
    printf("N = ..., M = ..."); 
    scanf("%d %d", &N, &M); 
    AllocMatrix(N, M, a); 

    for (i = 0; i < N; i++) { 
    for (j = 0; j < M; j++) { 
     scanf ("%s", &a[i][j].town); 
     scanf ("%s", &a[i][j].type_toy); 
     scanf ("%d", &a[i][j].nr); 
     scanf ("%s", &a[i][j].direction); 
    } 
    } 
    return 0; 
} 
+1

需要'A [1] =釋放calloc(M,的sizeof(面積)); '因爲你正在爲'i'行中的'M'矩陣分配內存 – vsoftco

+0

很多時候,在C中,將矩陣表示爲一維數組是值得的(可能是作爲最後的*靈活數組成員*結構')並訪問他們與例如一個宏#define matrix_at(m,i,j)m [(i)* width +(j)]' –

回答

3

無效AllocMatrix(INT N,INT男,區**一){

應該Area***因爲否則指針的傳值拷貝將保存已分配內存的地址,並且調用者函數將無法獲得它。

此外,

A [1] =釋放calloc(M,的sizeof(面積*));

sizeof(Area),如果我的第一點適用,它應該是(*a)[i] =

+0

用三重指針+1抓好! – vsoftco

+0

我在編譯時也有一些警告:format'%s'需要類型'char *'的參數,buet參數2的類型是'char(*)[20]'[-Wformat =] scanf(「%s」, &A [1] [j]的.town); ^ –

+0

@VladŞtefanDieaconu刪除'&' –

1

下面是一個簡單的選擇,如果你不要求具備的功能:

scanf("%d %d", &N, &M); 

Area (*a)[M] = calloc(N, sizeof *a); 

和其餘的代碼都是一樣的。這會是很好的做malloc前檢查M > 0,並檢查malloc不返回NULL繼續之前,


而且你scanfs是不正確的:

  • "%s""%19s"防止緩衝區溢出
  • &不應該包含在%s中,這是因爲%s需要一個指向第一個字符的指針來w儀式(不是指向整個數組的指針),並且當您使用數組的名稱時,它已被隱式轉換爲指向第一個元素的指針。
  • char direction;應具有"%c"
+0

謝謝。它現在有效。 –