【问题标题】:Matrix of structs in CC中的结构矩阵
【发布时间】:2014-12-19 19:47:57
【问题描述】:

如何制作结构矩阵或结构指针矩阵?矩阵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;
}

【问题讨论】:

  • 您需要a[i] = calloc(M, sizeof(Area)); ,因为您正在为i-th 行中的M 矩阵分配内存
  • 很多时候,在 C 中,将矩阵表示为一维数组(可能是某些 struct 的最终灵活数组成员)并使用以下命令访问它们是值得的例如一个宏#define matrix_at(m,i,j) m[(i)*width+(j)]

标签: c matrix struct


【解决方案1】:

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

应该是Area***,否则指针的传值拷贝将保存分配内存的地址,调用函数将无法获得它。

进一步,

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

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

【讨论】:

  • 编译时我也有一些警告:格式'%s'需要'char '类型的参数,但参数2的类型为'char ()[20]' [ -Wformat=] scanf ("%s", &a[i][j].town); ^
  • @VladŞtefanDieaconu 删除 &amp;
【解决方案2】:

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

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

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

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


你的 scanfs 也不正确:

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

【讨论】:

    猜你喜欢
    • 2017-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多