创建链接列表时出现分段错误

时间:2015-05-20 02:37:57

标签: c linked-list segmentation-fault

我有这个代码创建一个链表但我得到一个分段错误错误。任何解决方案?

    struct node *temp = (struct node*)malloc(sizeof(struct node));
    char *a = title_parser(bytes, temp);
    head = temp;

    temp = (struct node*)malloc(sizeof(struct node));
    title_parser(a, temp);

    puts(a); // Is NULL

    struct node* temp1 = head;
    while(temp1->link != NULL)
    {
            temp1 = temp1->link;
    }
    temp1->link = temp;

编辑:程序遍历函数title_parser后,内存再次被分配给temp,但是当第二次title_parser被调用时,这就是发生分段错误的时候。

这是我的title_parser

代码
char* title_parser(char *bytes, struct node *temp){

char *ptr = strstr(bytes, "<title>");


if (ptr) {

    /* Skip over the found string */
    ptr += 7;
    char *ptr2 = strstr(ptr, "</title>");
    if (ptr2) {
        char* output = malloc(ptr2 - ptr + 1);
        memcpy(output, ptr, ptr2 - ptr);

        output[ptr2 - ptr] = 0;

        if(strcmp(output,"TechCrunch")!=0 && strcmp(output,"VentureBeat")!=0){
            temp->title = output;
            temp->link = NULL;
            puts(temp->title);
            free(output);
            char *load = pubdate_parser(ptr2, temp);
            return load;
        }
        else{
            title_parser(ptr2, temp);
        }
    }
}

}

编辑:另一个问题是当title_parser返回加载时,我在main中打印a,输出为NULL。

2 个答案:

答案 0 :(得分:0)

在我看来,这个错误不是由malloc行引起的,你可以检查你的函数title_parser(bytes,temp),你可以注意它,然后再次运行你的程序。 这是我的测试代码:

    #include<stdio.h>
    #include<stdlib.h>
    struct node{
        int val;
        struct node *next;
    };

    void main()
    {
       struct node *tmp=(struct node*)malloc(sizeof(struct node));
       tmp->val=1;
       struct node *head=tmp;
       tmp=(struct node*)malloc(sizeof(struct node));
       tmp->val=2;
       printf("%d\n",tmp->val);
    } 

输出为2,因此段错误没有按预期显示。您可以尝试一下!

答案 1 :(得分:0)

if(strcmp(output,"TechCrunch")!=0 && strcmp(output,"VentureBeat")!=0)
{
  temp->title = output;
  temp->link = NULL;
  puts(temp->title);
  free(output);                              // error
  char *load = pubdate_parser(ptr2, temp);
  return load;
}

在指定标题指向malloced块后,您正在释放output 当你以后尝试访问内存时,这会给你带来麻烦。

最好使用更多描述变量名而不是temp和temp1 通过重用变量和使用通用名称,您可以不必使用代码 难以阅读。

您还可以使用一个变量,它在计算时就像计算一样 字符串的长度使它更加清晰和捕获 如果由于某种原因字符串格式错误

,则会出现任何错误

所以而不是

    char* output = malloc(ptr2 - ptr + 1);
    memcpy(output, ptr, ptr2 - ptr);

    output[ptr2 - ptr] = 0;

你可以做到

    int titleLength = ptr2 - ptr1;
    if ( titleLength > 0 )
    {
      output = malloc(titleLength + 1);
      strncpy(output, ptr, titleLength);
      output[titleLength] = '\0';
    }
    else { some error message }

有点难以看到title_parser返回的内容 函数,函数的名称意味着它返回标题,但确实如此 似乎并非如此。