【问题标题】:C - Problems Creating Dynamic Matrix FunctionC - 创建动态矩阵函数的问题
【发布时间】:2014-02-22 05:40:43
【问题描述】:

我在 main 中创建了一个动态矩阵,但后来决定最好实现一个函数,以便在必要时更容易创建更多。我将代码移向函数,但还不够好。

一旦我尝试写入 M[0][0],我的程序就会崩溃。

这是我的编译方式(没有错误): gcc -Wall -std=c99 -o output.exe source.c

#include <stdio.h>
#include <stdlib.h>

void MakeMATRIX (int** MATRIX, int* ROW, int* COL);

int main()
{
int SIZE;
scanf("%d", &SIZE);

int** M = NULL;

MakeMATRIX(M, &SIZE, &SIZE);

---MORE CODE GOES HERE---

scanf("%d", &M[0][0]);

return 0;
}

void MakeMATRIX (int** MATRIX, int* ROW, int* COL)
{
MATRIX = (int **)malloc(*ROW * sizeof(int*));

for (int i = 0; i < *ROW; i++)
  {
  MATRIX[i] = (int *)malloc(*COL * sizeof(int));
  }
}

【问题讨论】:

  • 您必须从 makeMatrix 函数返回 MATRIX 指针并将其分配给 M,否则您将指向 NULL。
  • 哦,既然您指出了这一点,那就有道理了。感谢您,我设法解决了它!

标签: c arrays function pointers dynamic


【解决方案1】:

你应该从MakeMatrics函数返回分配的矩阵。

int ** MakeMATRIX (int** MATRIX, int* ROW, int* COL)
{
  MATRIX = (int **)malloc(*ROW * sizeof(int*));

  for (int i = 0; i < *ROW; i++)
  {
    MATRIX[i] = (int *)malloc(*COL * sizeof(int));
  }

  return MATRIX;
}

main()

M = MakeMATRIX(M, &SIZE, &SIZE);

否则你可以传递&amp;M并分配在*MATRIX而不是MATRIX

您的代码值M 不会在main() 中更改,因为它是按值传递的,即使它的指针,您也将它作为值传递。

它分配给NULL,当您尝试取消引用它时会出现分段错误。

【讨论】:

    【解决方案2】:

    在被调用函数中更改的局部变量对调用函数没有影响。这里要更改MATRIX 的值,所以需要传递MATRIX 的地址才能保留其值。

    void MakeMATRIX (int*** MATRIX, int ROW, int COL) //value of ROW and COL seems fine to pass since they are not changed
    {
    *MATRIX = (int **)malloc(ROW * sizeof(int*));
    
    for (int i = 0; i < ROW; i++)
      {
      *MATRIX[i] = (int *)malloc(COL * sizeof(int));
      }
    }
    

    main():

    MakeMATRIX(&M, SIZE, SIZE);
    

    另一种方法是返回MATRIX

    int** MakeMATRIX (int ROW, int COL)
    {
    int **MATRIX = (int **)malloc(ROW * sizeof(int*));
    
    for (int i = 0; i < ROW; i++)
      {
      MATRIX[i] = (int *)malloc(COL * sizeof(int));
      }
    }
    

    所以main() 将是:

    int** M;
    
    M=MakeMATRIX(SIZE, SIZE);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-17
      • 2019-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-09
      相关资源
      最近更新 更多