动态分配矩阵并处理所有错误的功能

时间:2018-02-16 02:35:18

标签: c

我创建了这个函数来动态分配矩阵。我想知道如果出现问题,函数是否会处理所有情况(我的意思是免费的malloc()做了什么)。

void allocate(double*** m, int r, int c){
  int l;
  *m = (double**)malloc(sizeof(double*)*r);
  if(*m == NULL) return;
  for(l=0;l<r;l++){
    (*m)[l] = (double*)malloc(sizeof(double)*c);
    if((*m)[l] == NULL) {
        int l2;
        for(l2=0;l2<l;l2++)
            free((*m)[l2]);
        free(*m);
        *m = NULL;
        return; 
    }
  }
}

1 个答案:

答案 0 :(得分:1)

正如comment中所述,在广泛的限制范围内,如果您的代码遇到分配错误,您就会正确释放错误之前分配的所有数据。

您需要一个功能来释放分配的内存;它需要知道要释放多少行。您可以在错误恢复中使用它,使用l作为要释放的行数。

void deallocate(double **matrix, int rows)
{
    for (int i = 0; i < rows; i++)
        free(matrix[i]);
    free(matrix);
}

那不会将传入的指针设置为null;如果你坚持,你可以使用三星界面,但它可能不值得(IMO - YMMV)。然后可以在分配代码中使用它。

void allocate(double ***m, int r, int c)
{
    *m = (double **)malloc(sizeof(double *) * r);
    if (*m == NULL)
        return;
    for (int l = 0; l < r; l++)
    {
        (*m)[l] = (double *)malloc(sizeof(double) * c);
        if ((*m)[l] == NULL)
        {
            deallocate(*m, l);
            *m = NULL;
            return; 
        }
    }
}

有些人对#39; no cast on malloc()&#39; - 我不是其中之一,但是如果没有包含<stdlib.h>,我确保我的代码不能在我的开发环境中编译(所以当它是malloc()等时没有可用的声明所谓的)。即使他们没有使用我使用的严格警告/错误选项进行编译,这对用户来说也是安全的。

另请注意,Three-star Programmer并非恭维。正如评论中所建议的那样,您可以使用不同的界面:

double **allocate(int r, int c)
{
    double **matrix = (double **)malloc(sizeof(double *) * r);
    if (m == NULL)
        return NULL;
    for (int l = 0; l < r; l++)
    {
        matrix[l] = (double *)malloc(sizeof(double) * c);
        if (matrix[l] == NULL)
        {
            deallocate(matrix, l);
            return NULL; 
        }
    }
    return matrix;
}

请注意,因为分配(和释放)函数对大小参数使用int而不是size_t,所以可能会得到负值。您还可以提供零 - 但如果大小为零,则代码将“正常工作”。安全,但结果将无法使用(没有分配空间)。