matrix* make_matrix(size_t width, size_t height, size_t k, options opt){
matrix *m= malloc(sizeof(matrix));
if(m==NULL) return NULL;
m->width = width;
m->height = height;
m->k = k;
/*
Since m->data is a int **, it points to int *,
so I have to allocate a number of int *-sized objects to store in it.
*/
//m->data = malloc(sizeof(int *)*height);
m->data = calloc(height, sizeof(int*));
if(m->data == NULL){
free(m);
return NULL;
}
for(size_t i=0; i < height; i++){
//m->data[i] = malloc(sizeof(int)*width);
m->data[i] = calloc(width, sizeof(int));
if(m->data[i] == NULL){
for(size_t j = 0; j < i; j++) free(m->data[j]);
free(m->data);
free(m);
return 0;
}
/*
for(size_t j = 0; j < width; j++){
m->data[i][j] = 0;
}*/
}
return m;
}
我正在生成一个2d数组,我使用malloc而不是calloc。事实证明,这将是一个稀疏矩阵,其中大多数元素将为零。所以我决定使用calloc。我的问题是,我是否需要保留if语句
if(m->data[i] == NULL){
for(size_t j = 0; j < i; j++) free(m->data[j]);
free(m->data);
free(m);
return 0;
}
我写了这个,因为malloc没有处理堆栈溢出问题所以如果它失败了那么我必须以相反的顺序释放这些块。我仍然使用calloc保留此代码吗?
答案 0 :(得分:2)
是。 calloc
可以(并且将会)失败,就像malloc
一样难。
答案 1 :(得分:1)
这不是“堆栈溢出”的情况,因为您在堆上分配对象。
if
和malloc
都需要calloc
。它的作用是,如果你在分配中途失败,它将删除你已经分配的部分。订单并不重要。