双指针和内存分配

时间:2013-12-06 21:55:32

标签: c pointers matrix struct

我有一个使用双指针制作矩阵的结构:

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

 }

请帮忙吗?

4 个答案:

答案 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);
相关问题