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



我正试图将一个文件发送到一个函数,该函数创建一个名为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";
  }
}

从main中获取:条目ourMat=(*matCreate(fp))[N_CC];

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

我哪里错了?

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

对于arrays选项的array,您可以这样声明和分配它:

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来简化所有这些语法。就我个人而言,我不喜欢这样做,因为当数组指针衰减时就不那么明显了。

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

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

相关内容

  • 没有找到相关文章

最新更新