通过函数分配矩阵内存

时间:2017-05-09 06:25:01

标签: c pointers matrix malloc

我正在使用这些线来创建可变大小的矩阵:

Temp_Mat_0 = (double  **)malloc((M)*sizeof(double  ));
for (i=0;i<M;i++)
    Temp_Mat_0[i] = (double  *)malloc((N)*sizeof(double  ));

它们工作正常但我在代码中反复使用它们。我需要将它们转换为我传递指针和大小的函数。由于指针混乱,我无法做到这一点。

matrixAllocate(Matrix Pointer,rows,colms)

你能帮忙吗?

2 个答案:

答案 0 :(得分:2)

  

他们工作正常

他们似乎不太好。代码应更改为:

Temp_Mat_0 = malloc((M)*sizeof(double*));  //double* instead of double
if (Temp_Mat_0 == NULL)
    return;
for (i = 0; i < M; i++){
    Temp_Mat_0[i] = malloc((N)*sizeof(double));
    if (Temp_Mat_0[i] == NULL){
        free(Temp_Mat_0);
        return;
    }
}

然后,你可以使用这样的函数:

double ** matrix_pointer = matrixAllocate(rows,colms);

其中function matrixAllocate返回它分配的指针。例如:

matrixAllocate(rows,colms){
    Temp_Mat_0 = malloc((rows)*sizeof(double*));  
    if (Temp_Mat_0 == NULL)
        return NULL;
    for (i = 0; i < rows; i++){
        Temp_Mat_0[i] = malloc((colms)*sizeof(double));
        if (Temp_Mat_0[i] == NULL){
           free(Temp_Mat_0);
           return NULL;
        }
    }
    return Temp_Mat_0;
}

并称之为:

double **matrix pointer;
matrix pointer = matrixAllocate(rows, colms);

之后不要忘记释放malloc内存。

for (i = 0; i < M; i++){
    free(Temp_Mat_0[i]);
}
free(Temp_Mat_0);

请注意you should not cast the result of malloc,您还应该check if malloc was successful

答案 1 :(得分:2)

我认为你最好使用一个非常简单的方案,将你的矩阵分配为一个连续的块。

double **matrix_alloc(int rows, int cols)
{
    /* Allocate array of row pointers */
    double ** m = malloc(rows * sizeof(double*));
    if (!m) return NULL;

    /* Allocate block for data */
    m[0] = malloc(rows * cols * sizeof(double));
    if (!m[0]) {
        free(m);
        return NULL;
    }

    /* Assign row pointers */
    for(int r = 1; r < rows; r++) {
        m[r] = m[r-1]+cols;
    }

    return m; 
}

这有额外的好处,当你释放矩阵时,你不需要记住它有多大:

matrix_free( double** m )
{
    if (m) free(m[0]);
    free(m);
}

作为对此的扩展,您可以声明一个结构,该结构还跟踪它具有的行数和列数。 e.g。

struct matrix {
    int rows, cols;
    double **m;
};

这使得你的矩阵函数看起来更好一些(你可以传递struct matrix*而不是double**)。它有额外的好处,矩阵维度随相关数据传播。

除非你有巨大的矩阵,否则通常最好使用一个连续的块作为矩阵数据。如果你的矩阵很小,那就非常好了,因为你可以在你的CPU缓存中获得更好的内存局部性 - 这意味着可以加快代码的速度。