我有这个代码创建一个链表但我得到一个分段错误错误。任何解决方案?
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。
答案 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返回的内容 函数,函数的名称意味着它返回标题,但确实如此 似乎并非如此。