Организация массива указателей после realloc - PullRequest
0 голосов
/ 04 января 2019

Я создал динамический список:

Структура:

typedef struct{
    char *id;
    char *name;
    char *surname;
    int age;
    char gender;
    char *username;
    char *password;
    char *description;
    char *hobbies;
}User;

И после создания пользователя ** headMan я добавляю пользователей через:

void newMan(User **headMan, int *size, char *id, char *name, char *surname,
            int age, char gender, char *username,
            char *password, char *description, char *hobbies){
    if(*size == 0){
        *headMan = (User*)malloc(sizeof(User));
        if(*headMan == NULL){
            printf("Allocation of (*headMan) failed\n");
            exit(1);
        }
        (*headMan) -> id = (char*)malloc(ID_LENGTH*sizeof(char));
        if ((*headMan) -> id == NULL){
            printf("Allocation of (*headMan) -> id failed\n");
            exit(1);
        }
        strcpy((*headMan) -> id,id);
        (*headMan) -> name = (char*)malloc(NAME_LENGTH*sizeof(char));
        if ((*headMan) -> name == NULL){
            printf("Allocation of (*headMan) -> name failed\n");
            exit(1);
        }
        strcpy((*headMan) -> name,name);
        (*headMan) -> surname = (char*)malloc(NAME_LENGTH*sizeof(char));
        if ((*headMan) -> surname == NULL){
            printf("Allocation of (*headMan) -> surname failed\n");
            exit(1);
        }
        strcpy((*headMan) -> surname, surname);
        (*headMan) -> age = age;
        (*headMan) -> gender = gender;

        (*headMan) -> username = (char*)malloc(MAX*sizeof(char));
        if ((*headMan) -> username == NULL){
            printf("Allocation of (*headMan) -> username failed\n");
            exit(1);
        }
        strcpy((*headMan) -> username, username);

        (*headMan) -> password = (char*)malloc(NAME_LENGTH*sizeof(char));
        if ((*headMan) -> password == NULL){
            printf("Allocation of (*headMan) -> password failed\n");
            exit(1);
        }
        strcpy((*headMan) -> password, password);

        (*headMan) -> description = (char*)malloc(DESCRIPTION*sizeof(char));
        if ((*headMan) -> description == NULL){
            printf("Allocation of (*headMan) -> description failed\n");
            exit(1);
        }
        strcpy((*headMan) -> description, description);

        (*headMan) -> hobbies = (char*)malloc(NAME_LENGTH*sizeof(char));
        if ((*headMan) -> hobbies == NULL){
            printf("Allocation of (*headMan) -> hobbies  failed\n");
            exit(1);
        }
        strcpy((*headMan) -> hobbies, hobbies);
        (*size)++;
    }
    else{
        headMan[*size] = (User*)malloc(sizeof(User));
        if(headMan[*size] == NULL){
            printf("Allocation of headMan[*size] failed\n");
            exit(1);
        }
        headMan[*size] -> id = (char*)malloc(ID_LENGTH*sizeof(char));
        if (headMan[*size] -> id == NULL){
            printf("Allocation of headMan[*size] -> id failed\n");
            exit(1);
        }
        strcpy(headMan[*size] -> id,id);
        headMan[*size] -> name = (char*)malloc(NAME_LENGTH*sizeof(char));
        if (headMan[*size] -> name == NULL){
            printf("Allocation of headMan[*size] -> name failed\n");
            exit(1);
        }
        strcpy(headMan[*size] -> name,name);
        headMan[*size] -> surname = (char*)malloc(NAME_LENGTH*sizeof(char));
        if (headMan[*size] -> surname == NULL){
            printf("Allocation of headMan[*size] -> surname failed\n");
            exit(1);
        }
        strcpy(headMan[*size] -> surname, surname);
        headMan[*size] -> age = age;
        headMan[*size] -> gender = gender;

        headMan[*size] -> username = (char*)malloc(MAX*sizeof(char));
        if (headMan[*size] -> username == NULL){
            printf("Allocation of headMan[*size] -> username failed\n");
            exit(1);
        }
        strcpy(headMan[*size] -> username, username);

        headMan[*size] -> password = (char*)malloc(NAME_LENGTH*sizeof(char));
        if (headMan[*size] -> password == NULL){
            printf("Allocation of headMan[*size] -> password failed\n");
            exit(1);
        }
        strcpy(headMan[*size] -> password, password);

        headMan[*size] -> description = (char*)malloc(DESCRIPTION*sizeof(char));
        if (headMan[*size] -> description == NULL){
            printf("Allocation of headMan[*size] -> description failed\n");
            exit(1);
        }
        strcpy(headMan[*size] -> description, description);

        headMan[*size] -> hobbies = (char*)malloc(NAME_LENGTH*sizeof(char));
        if (headMan[*size] -> hobbies == NULL){
            printf("Allocation of headMan[*size] -> hobbies  failed\n");
            exit(1);
        }
        strcpy(headMan[*size] -> hobbies, hobbies);
        (*size)++;
    }

}

Теперь я перемещаюсь по списку пользователей с индексом, например headMan [i], теперь, когда я пытаюсь удалить пользователя, я использую:

void removeMan(User** head, int* numberOfMen,char*  existUser){

    if ((strcmp(head[1] ->username,existUser) == 0)){
        freeUser(head[1]);
        free(head[1]);
        head = (User**)realloc(head, (*numberOfMen-1)*sizeof(User));
    }
    printListMen(head,numberOfMen);
} 

Когда freeUser освобождает все поля структуры, теперь я могуне понимаю, как работает realloc.

Если у меня есть список из 5 пользователей, и я удалил одного из них на 3-м месте, использование realloc переместит размер списка в 4?кто будет указан на 3-м месте?

1 Ответ

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

realloc() только изменяет размер выделенного блока памяти, ничего не перемещая.Вы должны сделать это сами.

Итак, если ваш массив выглядит следующим образом:

{ A, B, C, D, E }

, а затем вы удалите B, он будет выглядеть так:

{ A, empty, C, D, E }

Затем вам нужно переместиться C, D и E так, чтобы это выглядело так:

{ A, C, D, E, empty }

Только тогда вы можете позвонить realloc(), чтобы уменьшить его, так чтоэто выглядит так:

{ A, C, D, E }

Две вещи, которые нужно помнить о realloc():

  1. Когда вы уменьшаете блок, все, что было в обрезанном пространстве, теряется навсегда.
  2. При развертывании блока содержимое нового расширенного пространства становится мусором.Обязательно инициализируйте перед использованием.

В обоих случаях исходные данные, которые помещаются в области с измененным размером, копируются.

...