C - 创建动态矩阵函数的问题

时间:2014-02-22 05:40:43

标签: c arrays function pointers dynamic

我在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));
  }
}

2 个答案:

答案 0 :(得分: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);

否则,您可以传递&M并在*MATRIX而不是MATRIX中分配。

您的代码值Mmain()中不会因为传递值而改变,即使是指针,您也会将其作为值传递。

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

答案 1 :(得分:0)

调用函数中更改的局部变量对调用函数没有影响。您要更改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);