Malloc иногда работает, а иногда нет (общий связанный список) - PullRequest
0 голосов
/ 08 апреля 2019

Я создаю общий связанный список. Данные в список загружаются из файла .txt (функция loadClients). Проблема в том, что когда я помещаю второй элемент в список (функция push_back), malloc () иногда не работает, и у меня возникает ошибка 0xC0000005. Например, я запускаю программу 10 раз, и она работает хорошо, но в 11-й раз у меня появляется ошибка. Я даже не могу проверить, что возвращает malloc ().

Вот структура клиента:

typedef struct client
{
    int card_no;
    char last_name[30];
    char first_name[30];
    int phone_no;
    char email[60];
    char login[18];
    char password[20];
    bool admin;
}client_struct;

Вот общий список:

typedef struct List
{
    void *data;
    struct List *next;
}List;

Вот функция push_back:

void push_back(List **head,void *data,size_t size)
{
    if(*head==NULL)
    {
        *head = (List *)malloc(sizeof(List));
        (*head)->data = malloc(size);
        (*head)->data = data;
        (*head)->next = NULL;
    }else
    {
        List *current = *head;
        while(current->next != NULL)
            current = current->next;
        printf("PUSH BACK1!\n");
        current->next = (List *)malloc(sizeof(List)); //HERE IS THE PROBLEM
        printf("PUSH BACK2!\n");
        current->next->data = malloc(size);
        current->next->data = data;
        current->next->next = NULL;
    }
}

Вот функция loadClients. Эта функция возвращает указатель на созданный список.

List *loadClients()
{
    List *client_head = NULL;
    FILE *users = fopen("users.txt","r");
    if(users == NULL)
        return NULL;
    while(!feof(users))
    {
        client_struct *cl = malloc(sizeof(client_struct));
        memset(cl,0,sizeof(client_struct));
        char tab[200];
        memset(tab,0,200);
        fgets(tab,200,users);
        sscanf(tab,"%d %s %s %d %s %s %s %d",
    &cl->card_no,cl->last_name,cl->first_name,&cl->phone_no,
    cl->email,cl->login,cl->password,&cl->admin);
        printf("ADD\n");
        if(cl->card_no != 0)
            push_back(&client_head,(client_struct *)cl,sizeof(client_struct));
    }
    fclose(users);
    return client_head;
}

Как я могу исправить эту проблему?

1 Ответ

0 голосов
/ 08 апреля 2019

Компиляция с отладочной информацией (флаг -g):

gcc -g code.c

Затем запустите его через valgrind:

valgrind ./a.out

Тогда valgrind даст вам много полезной информации о том, что это такое.что идет не так, в какой строке кода и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...