C, Calloc автоматически заботится о переполнении? - PullRequest
1 голос
/ 25 марта 2011
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?

Ответы [ 2 ]

2 голосов
/ 25 марта 2011

Да.calloc может (и будет) терпеть неудачу так же сильно, как malloc.

1 голос
/ 25 марта 2011

Это не случай "переполнения стека", поскольку вы выделяете объекты в куче.

if требуется как для malloc, так и calloc.Что он делает, так это то, что если вы не пройдете половину своего выделения, он удалит части, которые вы уже выделили.Порядок не важен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...