我有一个使用双指针制作矩阵的结构:
typedef struct
{
int rows, cols;
int** element;
}Matrix;
我正在编写一个函数,通过动态地为这个结构分配内存来初始化矩阵。这是我编写的代码,但是当我尝试访问另一个函数或main中的a-> rows,cols或元素时,我遇到了分段错误。
void matrixInit (Matrix* ma, int m, int n)
{ int i;
ma=(Matrix*)malloc(sizeof(Matrix));
ma->rows=m;
ma->cols=n;
ma->element=malloc(m*sizeof(int*));
for(i=0;i<m;i++)
{ma->element[i]=malloc(n*sizeof(int));
}
}
请帮忙吗?
答案 0 :(得分:1)
在C中,每个函数参数都按值传递。这意味着当您为函数提供参数时,值的副本(而不是值本身)将作为函数中的参数传递。这包括指针 - 您可以更改指针引用的任何内容并且没有任何问题,但如果您将指针设置为指向函数中的其他内容,则更改仅适用于指针的本地副本。
ma=(Matrix*)malloc(sizeof(Matrix));
这里,不是让输入指针指向Matrix
结构的新分配内存,而是实际上用新的指针覆盖本地指针ma
而不对输入指针做任何事情。这导致了这个问题。要解决此问题,您可以返回指向ma
的指针。
答案 1 :(得分:0)
您需要传入一个指向指针的指针,以便调用者可以使用malloced指针。像这样:
void matrixInit (Matrix ** ma, int m, int n)
{
*ma = malloc(sizeof **ma); // sizeof **ma == sizeof(Matrix)
然后用它来调用它:
Matrix * matx;
matrixInit(&matx, 3, 4);
答案 2 :(得分:0)
您的函数不会返回它创建的矩阵。这样做。
Matrix * matrixInit (int m, int n)
{
Matrix* ma;
int i;
ma=(Matrix*)malloc(sizeof(Matrix));
...
return ma;
}
...然后使用它
Matrix * myMatrix;
myMatrix = matrixInit(8,8); // chessboard
答案 3 :(得分:0)
调用这样的函数时,会将指针值传递给矩阵。当您在函数中实际创建矩阵时,只能在本地分配它。
您应该将指针传递给要存储矩阵指针的变量,即Matrix **ma
。
void matrixInit (Matrix **ma_ptr, int m, int n)
{
int i;
*ma_ptr = (Matrix*)malloc(sizeof(Matrix));
Matrix *ma = *ma_ptr;
ma->rows=m;
ma->cols=n;
ma->element=malloc(m*sizeof(int*));
for(i=0;i<m;i++)
{
ma->element[i]=malloc(n*sizeof(int));
}
}
然后使用您希望存储矩阵的变量的地址调用此方法。
Matrix *m;
matrixInit(&m, 4, 4);
另一种方法是为函数的外部分配内存。 除了删除分配
之外,您的功能将完全按照您编写的方式保留ma = (Matrix*)malloc(sizeof(Matrix));
然后你会传给一个指向Matrix的指针,但是你必须确保它指向一个Matrix结构。你可以通过声明一个Matrix*
变量并在函数外部调用malloc()(然后在堆上分配它)来做到这一点,或者声明一个Matrix
类型的变量(并将其分配给栈)。
Matrix ma;
matrixInit(&ma, 4, 4);