Динамическое перераспределение массива - PullRequest
0 голосов
/ 04 февраля 2019

Я пытаюсь создать динамический список, но по какой-то причине список не увеличивается более чем на 2 элемента

    typedef struct{
    char* name;
    int age;
} student;

int Insert(void){
    int const MAX = 1000;
    int age;
    char name[MAX];
    int i=1;
    int const ENOGH = 2;
    int const AGE_ERR = 1;
    int flag=0;

    student** array = NULL;
    do{
        printf("insert student name\n");
        printf("user: ");
        scanf("%s",name);
        if( strcmp(name,"enough") != 0){
            printf("insert age\n");
            printf("user: ");
            scanf("%d",&age);
        }else{
            return ENOGH;
        }
        if ( age == -1){
            flag = AGE_ERR;
        }
        if (age != AGE_ERR){
            array = realloc(array, sizeof(student*)*(i+1));
            array[i] = malloc(sizeof(student));
            if (array[i] == NULL){
                printf("Erorr\n");
            }
            array[i]->name =(char*)malloc(sizeof(char)*(strlen(name)+1));
            strcpy(array[i]->name ,name);
            array[i]->age = age;
            i++;
        }
    }while (flag != AGE_ERR);

    return AGE_ERR;
}

Я уверен, что это как-то связано с перераспределением указателя на списоки список распределения элементов, но я не могу найти то, что

(хотя цикл никогда не заканчивается, чтобы сохранить некоторый код)

1 Ответ

0 голосов
/ 04 февраля 2019

Это неверно:

 array[i]->name =(char*)malloc(sizeof(strlen(name)));

Функция strlen возвращает int, поэтому sizeof(strlen(name)) оценивается как размер int.Скорее всего, этого недостаточно для какой-либо строки, которую вы храните.

Вместо этого вы хотите:

 array[i]->name = malloc(strlen(name) + 1));

Это выделяет место для строки плюс завершающего нулевого байта.На самом деле вы можете заменить и эту строку, и strcpy, следующий за ней, вызовом strdup:

 array[i]->name = strdup(name);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...