【问题标题】:How to create and return a 2D matrix from a function in C using malloc?如何使用 malloc 从 C 中的函数创建和返回二维矩阵?
【发布时间】:2023-03-02 22:38:01
【问题描述】:

我正在尝试将文件发送到一个函数,该函数创建一个名为 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 matrix malloc multidimensional-array


【解决方案1】:

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

【讨论】:

  • 谢谢,我自己都搞糊涂了。如果我可以再问一个问题,我是否仍然能够访问例如“ourMat[0][0].action”中的元素?我收到错误“下标值既不是数组也不是指针也不是向量”。
【解决方案2】:

你需要分配ma​​lloc返回指针到Entry **

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

【讨论】:

    猜你喜欢
    • 2012-12-14
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 2020-12-07
    • 2022-09-30
    • 2021-10-04
    • 1970-01-01
    • 2020-04-01
    相关资源
    最近更新 更多