В связанном списке программа закрывается при входе в член структуры - PullRequest
0 голосов
/ 06 ноября 2019

Хотя я изменил malloc для всех членов структуры, он закрывается перед входом в члены. Я думаю, что это проблема с памятью, но я не знаю, где я допустил ошибку.

struct player {
    int num;
    char name[40];
    int age;
    int Amatch;
    int goals;
    struct player* next;
};

Это структурный код.

printf("Enter the number of players: ");
scanf("%d", &player_num);

ptr = (struct player*)malloc(sizeof(struct player));
if (ptr == NULL) {
    printf("Error!");
    return 0;
}

ptrW = ptr;
ptrWW = ptr;

for (int j = 0; j < player_num; j++) {
    if (j != 0) {
        ptr = (struct player*)malloc(sizeof(struct player));
        if (ptr == NULL) {
            printf("Error!");
            return 0;
        }
    }
    ptr->num = (int*)malloc(sizeof(int));
    if (ptr->num == NULL) {
        printf("Error!");
        return 0;
    }
    strcpy(ptr->name ,(char*)malloc(sizeof(char) * 40));
    if (ptr == NULL) {
        printf("Error!");
        return 0;
    }
    ptr->age = (int*)malloc(sizeof(int));
    if (ptr->age == NULL) {
        printf("Error!");
        return 0;
    }
    ptr->goals = (int*)malloc(sizeof(int));
    if (ptr->goals == NULL) {
        printf("Error!");
        return 0;
    }
    ptr->Amatch = (int*)malloc(sizeof(int));
    if (ptr->Amatch == NULL) {
        printf("Error!");
        return 0;
    }
    if (j == player_num - 1) {
        ptr->next = NULL;
    }
    ptr = ptr->next;
}

Так я получаю malloc. Мне также любопытно, что есть простой способ получить malloc.

while (ptrW != NULL) {
    printf("**Player%d**\n", i);
    printf("Number : ");
    scanf("%d", ptrW->num);
    printf("Name : ");
    scanf(" ");
    gets_s(ptrW->name, sizeof(ptrW->name));
    printf("Age: ");
    scanf("%d", ptrW->age);
    printf("A-matches : ");
    scanf("%d", ptrW->Amatch);
    printf("Goals : ");
    scanf("%d", ptrW->goals);
    printf("\n");
    i++;
    ptrW = ptrW->next;
}

Вот проблема. Он хорошо работает при входе в player1, но перед вводом num player2 программа закрывается.

Ответы [ 2 ]

0 голосов
/ 06 ноября 2019

Прежде всего: я думаю, что вы должны использовать realloc, когда j! = 0. Вы не потеряете данные своей строки. Во-вторых: malloc / realloc / calloc - это функция, которую мы используем для выделения блока памяти, и вы можете использовать их только по указателю (после выделения указатель будет указывать на первый случай блока) В-третьих: функция strcpy () должнакопировать из строки - когда вы используете malloc в strcpy () -> компилятор не знает, что копировать (нет значения в блоке выделения). Надеюсь, что это помогло

0 голосов
/ 06 ноября 2019

Вам нужно только выделить место для самой структуры, а не переменные-члены в этом случае.

ptr = (struct player*)malloc(sizeof(struct player));
if (ptr == NULL) {
    printf("Error!");
    return 0;
}

Вы также должны указать адрес переменной в вызовах к scanf.

    scanf("%d", &ptrW->num);
    scanf("%d", &ptrW->age);
    scanf("%d", &ptrW->Amatch);
    scanf("%d", &ptrW->goals);
...