почему я получаю эту ошибку исключения — генерируется необработанное исключение: нарушение доступа на запись. head был 0xFFFFFFFFCBB1E630

#c

#c

Вопрос:

Строка head->data = (int)1; , выдает указанное выше исключение — генерируется необработанное исключение: нарушение доступа на запись. head был 0xFFFFFFFFCBB1E630. В чем может быть причина?

 #include <stdio.h>
#include <conio.h>

void print_nodes(struct Node* head);

struct Node {
    int data;
    struct Node* next;
};

void print_nodes(struct Node* head) {
    struct Node* current = (struct Node*)malloc(sizeof(struct Node));

    while (current->next != NULL) {
        printf("%d", current->data);
    }
}

void main() {
    struct Node* head = (struct Node*)malloc(sizeof(struct Node));
    struct Node* first = (struct Node*)malloc(sizeof(struct Node));
    struct Node* second = (struct Node*)malloc(sizeof(struct Node));

    head->data = 1;
    head->next = first;

    first->data = 2;
    first->next = second;

    second->data = 3;
    second->next = NULL;

    print_nodes(head);
}
  

Комментарии:

1. В чем смысл current ? Просто используйте head . current->next не инициализирован.

2. Когда это будет исправлено, while (current->next != NULL) будет бесконечный цикл, когда current->next != NULL . Должно быть struct Node* current = head и внутри цикла, current = current->next . Или просто работайте с head прямым print_nodes() вводом, поскольку это копия заголовка списка.

3. Как вы получили это для компиляции без включения <stdlib.h> и <malloc.h> ?

4. Спасибо. вы все правы. Я должен назначить struct Node* current = head; и запустить while (current) . я больше не получаю ошибку.

Ответ №1:

В print_nodes() , нет необходимости выделять.

 //struct Node* current = (struct Node*)malloc(sizeof(struct Node));
struct Node* current = head;
  

Еще лучше, начните с head , а не .next .

 void print_nodes(const struct Node* current) {
    while (current) {
        printf("%d", current->data);
        current = current->next
    }
}
  

Комментарии:

1. Спасибо. Вы помогли мне это исправить

Ответ №2:

Вы проверили, был ли head допустимым указателем? Вероятно, нет.

 struct Node* head = (struct Node*)malloc(sizeof(struct Node));
If(0==head) return 1;
head->data = 1;
  

Комментарии:

1. Это хорошая практика, но не причина ошибки здесь.

2. Спасибо. Я применил то, что вы предложили.