Почему этот C -код вставки linkedlist выдает ошибку сегментации?

#c #linked-list

#c #связанный список

Вопрос:

Я написал две функции для вставки в начале и вставки в конце в LinkedList. Но он показывает ошибку сегментации. Почему мой код выдает ошибку сегментации?

 /*Structure of the linked list node is as
struct Node {
  int data;
  struct Node * next;
  Node(int x) {
    data = x;
    next = NULL;
  }
}; */

// function inserts the data in front of the list
Node *insertAtBegining(Node *head, int newData) {
   Node* newnode;
   newnode->data = newData;
   newnode->next = head;
   head = newnode;
   return head;
}


// function appends the data at the end of the list
Node *insertAtEnd(Node *head, int newData)  {
   Node* newnode;
   newnode->data = newData;
   newnode->next = NULL;
   Node* temp;
   temp = head;
   while(temp->next!=NULL){
       temp = temp->next;
   }
   temp->next = newnode;
   return head;
}
  

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

1. Какие ошибки в строке seg? Это было бы очень полезно для нас. Кроме того, нет основного метода, поэтому мы не можем воспроизвести вашу проблему.

2. newnode является локальной переменной в обеих функциях, выделенной стеком. Так что он умрет, когда область действия будет завершена.

Ответ №1:

newnode является локальной переменной в обеих функциях, выделенной стеком. Так что он умрет, когда область действия будет завершена.

Вы должны выделить новую область памяти из кучи, а не из стека.

Решение :

 Node* newnode = (Node*)calloc(sizeof(Node),1);
  

Ответ №2:

 Node* newnode;
newnode->data = newData;
newnode->next = head;
  

Здесь вы проходите через неопределенный указатель, как если бы он указывал на объект. Поведение программы не уточнено.

Ответ №3:

Вы не можете точно знать, на что указывает указатель, и вам никогда не следует пытаться получить к нему доступ к данным, прежде чем вы укажете на фактический адрес или выделите для него память. Хорошей практикой является объявление указателей на null, чтобы избежать подобных ошибок. пример:

 Node* newnode = NULL;
newnode = (Node*)malloc(sizeof(Node));
ewnode->data = newData;
newnode->next = head;
  

Или, конечно, все это в режиме онлайн.
И не забудьте освободить память