C语言中的结构矩阵

时间:2014-12-19 19:47:58

标签: c matrix struct

如何制作结构矩阵或结构指针矩阵?矩阵a中的元素应为Area类型的结构。

这是我到目前为止所尝试的内容:

#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;
}

2 个答案:

答案 0 :(得分:3)

  

void AllocMatrix(int N,int M,Area ** a){

应该是Area***,否则指针的值传递副本将保存已分配内存的地址,并且调用者函数将无法获取它。

此外,

  

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

应为sizeof(Area),如果我的第一点适用,则应为(*a)[i] =

答案 1 :(得分:1)

如果您不需要具有该功能,这是一个简单的选项:

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

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

和你的其余代码相同。最好在执行M > 0之前检查malloc,并在继续之前检查malloc是否未返回NULL


您的scanfs也不正确:

  • "%s"应为"%19s"以防止缓冲区溢出
  • &不应包含%s,这是因为%s需要指向第一个字符的指针(不是指向整个数组的指针),当你使用数组的名称,它被隐式转换为指向第一个元素的指针。
  • char direction;应该有"%c"