Malloc Realloc免费版

时间:2014-01-05 23:51:02

标签: c malloc free realloc

你好我在大学练习我需要用这种方式malloc一个数组。星星阵列有1个插槽。如果输入多于一个,则数组加倍。如果输入超过2,则再次加倍等。之后我必须裁剪数组以适应输入的数量。例如,如果我有5个输入,那么阵列将有8个插槽,我必须使它有5个插槽,我无法弄清楚如何。到目前为止,这是我的代码:

nameInfoT* ReadNames(int* size){
    nameInfoT* names ;
    int array_size=1;
    int entries=0;
    char input[length];
    names=(nameInfoT*) malloc(sizeof(nameInfoT)*array_size);

    do{
        scanf("%s",input);
        if(!strcmp(input,"END")) break;

        if(entries==array_size){
            array_size=array_size*2;
            names= (nameInfoT*) realloc(names,sizeof(nameInfoT)*array_size);
        }

        names[entries].name=(char*)malloc(sizeof(char)*strlen(input));
        strcpy(names[entries].name,input);

        entries++;

    }while(1);

    printf("there are %d free spaces \n",array_size-entries);
    *size=entries;
    printf("there are %d entries \n",*size);

    int i;
    for(i=array_size;i>entries;i--){
        free(names[i]);//here it won't compile 
    }
    return names;

}

2 个答案:

答案 0 :(得分:4)

free / malloc / calloc的结果只能realloc。你不能释放个人元素。因此,最后您可以再次realloc再次达到所需的最终尺寸。

答案 1 :(得分:1)

你还有其他一些问题:
    1)当你为输入字符串分配空间时,你需要加1以保持尾随'\ 0'
    2)在你的realloc之前,你应该有一个switch语句,它将获取array_size并使用它来确定新的大小。如果我理解你的问题,你想从1 - > 2 - > 4 - > n(其中n是下一个数字)。你的realloc代码每次只增加一倍。你需要改变它。
    3)当你释放条目时,你需要小心,因为你似乎没有释放类/结构的'name'成员。
    4)在释放循环中的成员之后,在名称类/结构上执行一次释放。

我可以稍后仔细研究一下。