2016-11-16 4 views
1

Я пытаюсь использовать динамический массив структуры, содержащей динамический массив. Распределение выполняется в функции build_resuts, и память освобождается в функции free_data.выделить динамический массив структуры

Я делаю это правильно?

typedef struct InputResultsLine 
{ 
    long registered; 
    long *candidates; 
} InputResultsLine; 

void func() 
{ 
    InputResultsLine *data, totals; 
    int nbPollingPlaces = 10; 

    build_results(&data, &totals, 5, nbPollingPlaces);  

    free_data(&data, &totals, nbPollingPlaces); 
} 

void build_results(InputResultsLine **data, InputResultsLine *totals, int nbCandidates, int nbPollingPlaces) 
{ 
    int i; 
    InputResultsLine *ptrCurrentLine; 

    totals->candidates = (long*) malloc(nbCandidates * sizeof(long));  

    *data = (InputResultsLine*) malloc(nbPollingPlaces * sizeof(InputResultsLine)); 

    for(i = 0; i < nbPollingPlaces; i++) 
    {  
     ptrCurrentLine = &((*data)[i]); 
     ptrCurrentLine->candidates = (long*) malloc(nbCandidates * sizeof(long)); 

     // [...]  
    } 
} 

void free_data(InputResultsLine **data, InputResultsLine *totals, int nbPollingPlaces) 
{ 
    int i; 

    for(i = 0; i < nbPollingPlaces; i++) 
    { 
     free(((*data)[i]).candidates); 
    } 

    free(totals->candidates); 
    free(*data); 
} 

Я видел образцы, где распределение было как:

*data = (InputResultsLine*) malloc(nbPollingPlaces * (sizeof(InputResultsLine) + nbCandidates * sizeof(long))); 

Так я не уверен, как я должен делать и почему:

+0

попробуйте запустить отладчик памяти, например, valgrind. –

ответ

0

(кстати, в C вы не необходимо отбросить возвращаемое значение malloc(): если оно не скомпилировано, вы сделали ошибку)

Код, который вы находите, размещение всех массивов в одном буфере: это позволяет улучшить «местность памяти» (т. связанные вещи, находящиеся вместе в памяти) ценой неспособности изменять массивы индивидуально: это хорошо для производительности, но полезно только для данных, которые инициализируются один раз и не меняются со временем (или, по крайней мере, размер которых не изменяется со временем).

Он также позволяет вам освободить все это только одним звонком до free() и упрощает обработку ошибок (поскольку вам не нужно проверять, чтобы все вызовы malloc() в цикле были успешными, а если нет, освободите все вызовы которые преуспели до сих пор, а не другие ...)

Смежные вопросы