使用realloc多次使用unkown-size数组是一种好方法

时间:2017-03-30 17:45:56

标签: c arrays dynamic malloc realloc

我将读取一个包含未知大小数组的文件 像那样

1,2,3 ...... ....

5,6,8 ....

该算法安全快捷吗?

 array =NULL;    /* for realloc */
for(i=0;fgets(line,256,input) != NULL ;++i){
    array =(double**)realloc(array,sizeof(double*)*(i+1));
    value =strtok(line,selector); 
    for(j=0;value != NULL;++j){

        array[i] =(double*)realloc(array[i],sizeof(double)*(j+1));
        sscanf(value,"%lf",&array[i][j]);
        value =strtok(NULL,selector);
    }

}

1 个答案:

答案 0 :(得分:0)

关于速度:您的算法具有二次复杂度O(n^2),其中n是每行的值数或行数。这效率不高。

正常的解决方法是跟踪两个大小,分配的数组的大小以及当前正在使用的元素数。通过仅增加当前使用的元素数量(并将值存储在正确的位置,当然)或首先realloc()将数组添加到两次来添加一个值目前的规模。结果是,即使n非常大,数组中的平均元素也只复制一次。这使复杂性降至O(n)

当然,如果您的阵列中只有十个条目,那么所有这些都无关紧要。但是你要求速度。

关于安全性:我看到的唯一风险就是你通过创建大量临时对象来分割你的地址空间,这些临时对象只是在下一次迭代中被更大的临时对象替换。从长远来看,可能会导致内存饥饿增加,但实际上无法准确衡量这种效应。