2014-12-19 187 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

谢谢。它现在有效。 –