Почему я получаю сообщение об ошибке «Возникло исключение: нарушение прав записи. P был nullptr.? - PullRequest
0 голосов
/ 24 апреля 2019

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

exception thrown: write access violation. p was nullptr.

Почемуработать с NULL?

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>

#define RAND_MAX 51

typedef struct card_s {
    char suit;
    int face;
    struct card_s *next, *previous;
} card;

void addcard(card *p, card **hl, card **hr, int i, char c) {
    card *temp;
    temp = (card *)malloc(sizeof(card)); 
    temp->face = i;
    temp->suit = c;
    if (*hl == NULL) {
        temp->previous = NULL;
        temp->next = NULL;
        *hl = temp;
        *hr = temp;
    } else if (p == NULL) {
        temp->previous = p;
        temp->next = NULL;
        p->next = temp;
        *hr = temp;
    } else {
        temp->next = p->next;
        temp->previous = p;
        p->next = temp;
        temp->next->previous = temp;
    }
}

void delectecard(card *p, card **hl, card **hr) {
    if (p == *hl) {
        *hl = p->next;
    } else {
        p->previous->next = p->next;
    }
    if (p == *hr) {
        *hr = p->previous;
    } else {
        p->next->previous = p->previous;
    }
    free(p);
}

void createdeck(card *p, card **hl, card **hr) {
    int i = 1;
    int j;
    while (i <= 13) {
        j = 1;
        while (j <= 4) {
            if (j == 1)
                addcard(p, hl, hr, i, 'S');
            if (j == 2)
                addcard(p, hl, hr, i, 'H');
            if (j == 3)
                addcard(p, hl, hr, i, 'D');
            if (j == 4)
                addcard(p, hl, hr, i, 'C');
        }
    }
}

void printdeck(card *currentNode) {
    while (currentNode != NULL) {
        printf("Face: %d, Suit: %c\n", currentNode->face, currentNode->suit);
        currentNode = currentNode->next;
    }
}

int main(void) {
    card *headl = NULL, *headr = NULL;
    createdeck(headr, &headl, &headr);
    printdeck(headl);
}
нехорошо

1 Ответ

1 голос
/ 24 апреля 2019

В вашей функции addcard ();Вы проверяете, имеет ли p значение NULL:

else if (p == NULL) {
    temp->previous = p;
    temp->next = NULL;
    p->next = temp;
    *hr = temp;

Затем вы пытаетесь получить доступ к NULL p в строке:

 p->next = temp;

Как получить доступ к тому, что не существует!Вот откуда исходит ошибка исключения нулевого указателя.

Может быть, вы хотите инициализировать p как новую структуру card_s, как вы это сделали с temp.Использование calloc инициализирует как следующий, так и предыдущий указатели в NULL.

p = calloc(1, sizeof(card));

После этого вы застряли в бесконечном цикле, особенно в вашей функции createdeck.Причина в том, что вы никогда не увеличиваете или не уменьшаете ни j, ни i, поэтому цикл никогда не прерывается.

while (i <= 13) {

    j = 1;
    while (j <= 4) {
        if (j == 1)
            addcard(p, hl, hr, i, 'S');
        if (j == 2)
            addcard(p, hl, hr, i, 'H');
        if (j == 3)
            addcard(p, hl, hr, i, 'D');
        if (j == 4)
            addcard(p, hl, hr, i, 'C');
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...