需要帮助了解分段错误

时间:2015-07-17 00:45:24

标签: c

我得到了段错误是什么以及导致它们的原因,我的问题是为什么我的指针会导致它们?我正在尝试编写一个简单的链表,添加包含5的节点,我在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);
   }


}

4 个答案:

答案 0 :(得分:1)

您的程序不会导致temp->x = 5;的段错误。 当您进入while循环时,它会导致段错误。 while(right->next != NULL)

由于您将root初始化为null,因此在第一次调用追加到while循环的入口处时,检查right->next哪个是空对象,并导致一段错误!!

在开头插入if条件可以解决您的目的,例如::

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

答案 1 :(得分:1)

你的错误在这里:

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

您正在尝试检查“right-&gt; next”,其中“right”为NULL。

答案 2 :(得分:1)

插入行

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

temp->x = 5;之后。您的程序仍然崩溃 - 但只有之后打印出来。其他人已经指出了错误的根源 - 但要知道使用明智的印刷语句来测试你的假设的基本技巧仍然没有什么坏处。为什么你认为那条线导致错误?

答案 3 :(得分:0)

您正在访问NULL指针。当您呼叫NULL时,根目录为append,代码为

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

然后在你正在尝试在访问right-next时取消引用空指针。

您需要使用调试器逐步调试代码。