Если вы хотите очистить память (в отличие от памяти с мусором в ней), вам нужно calloc
вместо malloc
, но это тривиально.
Вы больше проблем:
1) no error checking
2) possibly needless malloc calls
3) you're allocating MAX_LINES of theses name_t structure but initializing
only one of them
Если поля .name
и .prob
не будут перераспределены, вам следует изменить определение name_t
на
typedef struct { char name[MAX_LEN]; prob_t prob[MAX_PROB]; } name_t;
и выделить все имена MAX_LINES__ за один раз: calloc(MAX_LINES, sizeof(name_t))
.
Если вам нужна исходная структура name_t
, то я бы имел инициализатор для одного:
int init_name_dict (name_t *this)
{
if(0==(this->name=calloc(MAX_LEN, sizeof *this->name))) return -1;
if(0==(this->prob=calloc(MAX_PROB, sizeof *this->prob))){ free(this->name); return -1; }
return 0;
}
деструктор для нее
void destroy_name_dict(name_t *this) { free(this->name); free(this->prob); }
и затем инициализирующий распределитель для всего массива:
name_t* new_name_dicts(void)
{
name_t *r = malloc(MAX_LINES*sizeof *r);
if(!r) return r;
int i;
for(i=0; i<MAX_LINES; i++)
if(0>init_name_dict(&r[i])) goto fail;
return r;
fail:
for(--i; i>=0; --i)
destructor_name_dict(&r[i]);
return NULL;
}
(В основном, что будет означать векторный конструктор C ++, который выбирает конструктор для типа ячейки.)