如何使用malloc从C中的函数创建和返回2D矩阵?

时间:2014-10-14 23:10:19

标签: c matrix malloc multidimensional-array

我试图将文件发送到一个函数,该函数创建一个名为Entry的结构矩阵,根据文件填充它,然后返回矩阵。现在它是一系列错误,我可以根据需要添加,但我怀疑我只是犯了多个愚蠢的错误。如果有一种更简单的方式不涉及malloc,那也可以。

我做错了什么,我该怎么做呢?

以下是相关代码:

Entry **matCreate(FILE *fp){

// initialize matrix
Entry matrix = malloc(states * N_CC * sizeof(Entry));

// populate the matrix with initial values
for (int i = 0; i < states; i++) {
  for (int j = 0; j < N_CC; j++) {
    matrix[i][j].next = 99;
    matrix[i][j].action = "D";
  }
}
return matrix;
}

并在主要功能中:

Entry **matrix = matCreat(fp);

我用

关闭了这个功能
Entry **matCreate(FILE *fp){

使用

初始化它
Entry (*matrix)[N_CC] = malloc( states * sizeof *matrix );

用以下内容填充:

for (int i = 0; i < states; i++) {
  for (int j = 0; j < N_CC; j++) {
    matrix[i][j].next = 99;
    matrix[i][j].action = "D";
  }
}

从以下主题获取:     输入ourMat =(* matCreate(fp))[N_CC];

但仍然收到错误:     tokenize.c:84:1:警告:从不兼容的指针类型返回[默认启用]

我哪里错了?

2 个答案:

答案 0 :(得分:2)

C没有真正的多维数组类型。您必须返回锯齿状数组,或返回数组数组。 (此外,由于数组不能按值返回;在这两种情况下,您必须动态分配数组,并返回指向它的指针)。 Further reading

对于数组数组选项,您可以像这样声明和分配它:

Entry (*matrix)[N_CC] = malloc( states * sizeof *matrix );

通过将此模式用于malloc的参数,您可以避免担心任何复杂的内容。

返回此指针的函数类型为:

Entry (*matCreate(FILE *fp))[N_CC];

在调用代码中,您可以使用如下函数:

Entry (*matrix)[N_CC] = matCreate(fp);
bar( matrix[1][2].action );

您可以使用typedef来制作所有这些更简单的语法。我个人不喜欢,因为当阵列指针衰减发生时,它就不那么明显了。

答案 1 :(得分:2)

您需要将 malloc 返回指针分配给Entry **

  Entry **matrix;
  matrix= (Entry**)malloc(states * sizeof(Entry *));
  for (i = 0; i < states; i++)
       Entry[i] = malloc(N_CC *   sizeof(Entry));