Проверка значений указателей init'd через malloc - PullRequest
0 голосов
/ 29 марта 2019

Я пытаюсь проверить и проверить, заполнен ли головной узел связанного списка правильным значением. Однако указатель, который указывает на этот головной узел, был инициализирован в другом связанном списке с использованием malloc, поэтому теперь значением точки является отрицательное число мусора, но оно не равно NULL, поэтому проверяется, не является ли указатель пустым. Попытка получить доступ к этому местоположению приводит к нарушению памяти. Как я могу проверить, действительно ли я когда-либо назначал этот указатель чему-либо, если, кажется, malloc сначала дает ему какое-то случайное значение?

Соответствующие определения структуры:

struct patient {
    char name[MAX_NAME];
    unsigned int roomNumber;
    struct doctor *doctors;     // linked list 'doctors' contains names of doctors
};

//  structure 'doctor' contains doctor's name 
struct doctor {
    char name[MAX_NAME];
    struct doctor *next;
};

Инициализация и добавление пациентов:

void addPatient(char* patientNameInput, unsigned int roomNumInput)
{

    // Creating and initializing the patient:
    struct patientList *l;
    struct patient *p;
    p = (struct patient *) malloc(sizeof(struct patient)); // allocating memory safely
    l = (struct patientList *) malloc(sizeof(struct patientList));
. . .

Код, о котором идет речь:

void displayList(struct patientList* tempList)
{

    while (tempList) {
        printf("\nPatient name: %s\n", tempList->patient->name);
        printf("Room number: %i\n", tempList->patient->roomNumber);

        printf("Problem pointer: %i", tempList->patient->doctors); // this will always print a garbage value

        // Doctor stuff
        if (!tempList->patient->doctors) { // Always fails.
            printf("Doctors: N/A\n");
        }
        else {
            printf("Doctors: "); // this is the last thing to be displayed, before throwing a memory access violation exception
            struct doctor* dList = tempList->patient->doctors; // temp doc list
            while (dList->name) {
                printf("%s\n", dList->name);
                dList = dList->next;
            }
        }
        tempList = tempList->next;
    }

}

Строка с пометкой «Всегда терпит неудачу» - это точка, в которой я хочу проверить, действительно ли здесь был назначен тип врача, в отличие от значения мусора, которое он печатает. Приношу свои извинения, если эта ошибка невероятно проста.

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