分段故障链表

时间:2014-01-10 09:00:27

标签: c linked-list segmentation-fault dynamic-memory-allocation

我看到一些类似的话题,但他们没有帮助我。我制作了链表,以及插入元素的功能。

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

struct node* head;

void insert(struct node* head,int x);
int main(){
    struct node* head = (struct node*) malloc(sizeof(struct node));
    int x;
    while(1){
        printf("Please enter number\n");
        scanf("%i", &x);
        insert(head,x);
        print(head); // function that works
    }
    return 0;
}
void insert(struct node* head,int x){
    struct node* temp = malloc(sizeof(struct node));
    temp->data = x;
    temp->next = NULL;
    if(head->next != NULL) temp->next = head;
    head = temp;
    free(temp);
}

GDB说我在使用if构造的线路上遇到了分段错误:

if(head->next != NULL) temp->next = head;

我的错误在哪里?

3 个答案:

答案 0 :(得分:0)

在致电head之前,您需要先检查if(head->next != NULL) temp->next = head;。 head可能包含NULL。因此,在if(head != NULL)

之前添加if(head->next != NULL) temp->next = head;

修改 如果您在提问时发布了完整的代码,那么很容易以正确的方式帮助您。现在人们认为我们回答错了,他们正在投票。好吧无论如何这里是我的答案。 你不应该在自己的插入函数中调用free(temp);。因为您要在print函数中访问该内存。您正在insert()自己释放已分配的内存并尝试访问打印功能。这导致了分段错误。从插入功能中删除free(temp);

答案 1 :(得分:0)

是的,它会给出分段错误。在if条件下,您正在访问head->nexthead只是struct node类型的指针。首先分配内存空间,然后访问该字段。现在你正在访问(head->next),这是内存中一些不合适的地址,而内核会给进程带来“分段错误”。例如,执行struct node* head = malloc(sizeof(struct node));,然后可以访问head->next

答案 2 :(得分:0)

请注意,您声明了两个具有相同名称(头部)但在不同范围内的变量:

struct node* head;

void insert(struct node* head,int x);
int main()
{
  struct node* head = (struct node*) malloc(sizeof(struct node));

在insert函数中,在检查'head'是否为NULL之前取消引用'head'。始终检查null并且从不假设任何东西。 在功能结束时释放新创建的节点,这也是错误的。最后,insert函数的参数不正确,你需要传递指针的地址才能更改头指向的位置。

该功能看起来应该是这样的

void insert(struct node** head,int x)
{
  struct node* temp = malloc(sizeof(struct node));
  temp->data = x;
  temp->next = NULL;

  assert( head != NULL ); // should always be an address

  if ( *head == NULL ) 
  {
    *head = temp; // done, first in list
  }
  else // insert as first in list
  {
    tmp->next = *head; 
    *head = tmp;       
  }
}

然后您应该将其称为:

insert(&head,x);