我创建了这个函数来动态分配矩阵。我想知道如果出现问题,函数是否会处理所有情况(我的意思是免费的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;
}
}
}
答案 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
,所以可能会得到负值。您还可以提供零 - 但如果大小为零,则代码将“正常工作”。安全,但结果将无法使用(没有分配空间)。