我在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));
}
}
答案 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
中分配。
您的代码值M
在main()
中不会因为传递值而改变,即使是指针,您也会将其作为值传递。
将其分配给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);