Правильное распределение памяти для структуры - PullRequest
0 голосов
/ 09 декабря 2011

Имея структуру, определенную таким образом, мне нужно выделить память

typedef struct string_collection {
    char **c;
    size_t current, allocated;
} TSC, *ASC;

Итак, я пришел с этим кодом, это правильно, или я что-то пропустил?Сначала выделяем дескриптор структуры, а затем достаточно места для d указателей на строку

ASC AlocSC(size_t d)
{
    ASC sc;

    sc = (TSC*) malloc(sizeof(TSC));
    if (!sc) return NULL;

    sc->c = calloc(d, sizeof(char *));

    if (!sc->c) {
        free(sc);
        return NULL;
    }

    sc->current = 0;
    sc->allocated = d;

    return sc;
}

Ответы [ 2 ]

2 голосов
/ 09 декабря 2011

Отредактированный код, по сути, правильный, хотя у меня есть несколько стилистических различий с вами (таких как отсутствие typedef для скрытия "pointerness" объекта, не использование размера выделенного объекта в вызове malloc / calloc и еще несколько вещей).

Ваш код немного "очищен":

TSC *AlocSC(size_t d)
{
    TSC *sc = malloc(sizeof *sc);
    if (!sc) return NULL;

    sc->c = calloc(d, sizeof *sc->c);
    if (!sc->c) {
        free(sc);
        return NULL;
    }

    sc->current = 0;
    sc->allocated = d;

    return sc;
}
2 голосов
/ 09 декабря 2011

До тех пор, пока x заменяется на sc, для меня это выглядит нормально.Однако вы не должны разыгрывать возврат malloc в C (подробнее здесь ).Вместо этого я бы использовал для этой строки:

sc = malloc(sizeof(*sc));

Вы можете сделать то же самое для размера типа x->c указывает на (char*).

...