2015-07-17 3 views
0

Я получаю, что такое segfaults и что их вызывает, мой вопрос - почему мой указатель вызывает их? Я пытаюсь написать простой связанный список, который добавляет на узлы, содержащие 5, и я получаю segfault в temp-> x = 5 ;. Я думал, что malloc() должен был позволить мне доступ к памяти, в которой он нуждается?Нужна помощь Понимание ошибок сегментации

#include <stdio.h> 
#include <stdlib.h> 

struct node{ 
    int x; 
    struct node *next; 
}; 


void append(struct node *root){ 

    struct node *temp, *right; 
    temp = (struct node *)malloc(sizeof(struct node)); 
    temp->x = 5; 
    right = (struct node *)root; 

    while(right->next != NULL){ 
     right = right->next; 
    } 

    right->next = temp; 
    right = temp; 
} 

int main(){ 

    struct node *root; 

    root = NULL; 


    int userInput; 

    printf("Pick Operation: "); 
    scanf("%d", &userInput); 

    if(userInput == 1){ 
     append(root); 
    } 


} 
+2

'root = NULL;' .. 'append (root);' as' append (NULL); '..' right = (struct node *) root; 'as' right = NULL; '..' while (right-> next! = NULL) {'as' while (NULL-> next! = NULL) {' – BLUEPIXY

+0

не может разыменовать NULL-указатель ' root = NULL; '' right = root; ' разыменован здесь' while (right-> next! = NULL); ' – cmidi

+0

Как всегда, стандартное предупреждение: в' c', не выдавать результат 'malloc()'. Очевидно, что лить «корень» в свой собственный тип является излишним. –

ответ

1

Ваша программа не вызывает segfault на temp->x = 5;. Это вызывает segfault при вводе цикла while. while(right->next != NULL)

Поскольку вы инициализировать ваш root к нулю, так что по первому зову, чтобы добавить на входе вашего while петли, вы проверяете right->next, который находится на нулевой объект, и вызывает Segfault !!

Вставка if условия в начале будет решить вашу цель, что-то вроде этого ::

if(root == NULL) { 
root = temp; 
} else { 
    while(right->next != NULL) { 
     /*your loop*/ 
    } 
} 
0

Вы обращаетесь указателем NULL. Корень NULL, когда вы звоните append, а в коде

... 
    right = (struct node *)root; 
    while(right->next != NULL){ 
    ... 

то в вы пытаетесь разыменования нулевого указателя, когда вы доступ к right-next.

Вам нужно пройти через свой код с помощью отладчика.

1

Ваша ошибка здесь:

while(right->next != NULL){ 
    right = right->next; 
} 

Вы пытаетесь проверить "право-> рядом", где "право" является NULL.

1

Вставьте линию

printf("%d is okay\n",temp->x); 

сразу после temp->x = 5;. Ваша программа по-прежнему падает, но только после печатает. Другие уже указали на источник ошибки - но все же не мешает знать базовый трюк использования разумных заявлений печати для проверки ваших предположений. Почему вы думаете, что эта строка вызвала ошибку?

Смежные вопросы