Мэллок Реаллок Бесплатно

Здравствуйте, мне для упражнения в университете мне нужно выделить массив таким образом. Массив у звезд имеет 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;

}

person JmRag    schedule 05.01.2014    source источник
comment
Не разыгрывайте mallocs.   -  person arshajii    schedule 06.01.2014
comment
Не используйте scanf с "%s"! Вместо этого используйте fgets или POSIX getline. Просто из любопытства: вас учили так использовать scanf в вашем университете?   -  person mafso    schedule 06.01.2014
comment
@mafso да ... Мы считаем это равным fgets или getline   -  person JmRag    schedule 06.01.2014


Ответы (2)


Вы можете только free получить результат malloc/calloc/realloc. Вы не можете освободить отдельные элементы. Так что, в конце концов, вы можете просто снова realloc до желаемого конечного размера.

person Kerrek SB    schedule 05.01.2014
comment
Я думал, что realloc только добавляет дополнительное пространство. Я не знал, что он может удалить пробел. Спасибо ! - person JmRag; 06.01.2014
comment
@Mario: Насколько имеет смысл удаление пробела :-) - person Kerrek SB; 06.01.2014

У вас есть пара других проблем:
1) когда вы выделяете место для входной строки, вам нужно добавить 1, чтобы сохранить конечный '\0'
2) перед вашим realloc у вас должен быть оператор switch который возьмет array_size и использует его для определения нового размера. Если я понимаю вашу проблему, вы хотите перейти от 1 -> 2 -> 4 -> n (где n - следующее число). Ваш код realloc просто удваивается каждый раз. Вам нужно изменить это.
3) когда вы освобождаете записи, вам нужно быть осторожным, так как вы, похоже, не освобождаете член 'name' класса/структуры.
4) после освобождения элемента члены в цикле, затем сделайте один свободный для имен class/struct.

Я мог бы изучить его более внимательно позже.

person No One in Particular    schedule 06.01.2014