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;
}
Я создаю 2-мерный массив и использую 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?