分配动态结构数组

时间:2016-11-16 09:55:35

标签: c arrays malloc dynamic-allocation

我正在尝试使用包含动态数组的结构的动态数组。 分配在函数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)));

所以我不确定我该怎么做以及为什么:

1 个答案:

答案 0 :(得分:0)

(顺便说一句,在C中,你不需要转换malloc()的返回值:如果没有强制转换而没有编译,你就犯了错误) < / p>

你觉得奇怪的代码涉及在一个缓冲区中分配所有数组:这样可以实现更好的“内存局部性”(即相关内容在内存中),代价是无法单独修改数组:这对性能有利但仅对初始化一次且不随时间变化的数据有用(或者至少,其大小不随时间变化)。

它还允许您通过只调用free()来释放整个事物,并使错误处理更加简单(因为您不必检查循环中的所有malloc()调用是否成功,如果没有,请释放迄今为止取得成功的所有电话而不是其他电话......)