strcpy分段故障

strcpy分段故障,c,struct,segmentation-fault,strcpy,C,Struct,Segmentation Fault,Strcpy,我有一个四边形列表,它们有一个从1开始的标签。backpatch采用列表结构,指向一些四边形。我希望backpatch更新这些四元组,将z放在字符*第四个上,然后清空l,以便以后可以放置其他四元组。我在backpatch的strcpy中得到seg.fault,尽管我已经为char*z和char*fourth分配了内存。有人知道为什么会这样吗 struct quad { char *label; //5 char *first; //30 char *second; char *third; ch

我有一个四边形列表,它们有一个从1开始的标签。backpatch采用列表结构,指向一些四边形。我希望backpatch更新这些四元组,将z放在字符*第四个上,然后清空l,以便以后可以放置其他四元组。我在backpatch的
strcpy
中得到
seg.fault
,尽管我已经为
char*z
char*fourth
分配了内存。有人知道为什么会这样吗

struct quad {
char *label; //5
char *first; //30
char *second;
char *third;
char *fourth;
struct quad *next;
};

struct list {
    struct quad *quadlist;
    struct list *nextlist;
};


void backpatch(struct list *l, char * z) {
struct list *temp = (struct list*) malloc(sizeof (struct list));
temp->nextlist = (struct list*) malloc(sizeof (struct list));
temp->quadlist = (struct quad*) malloc(sizeof (struct quad));
temp->quadlist->fourth = (char*)malloc(30 * sizeof (char));
l->nextlist = (struct list*) malloc(sizeof (struct list));
temp = l;
//z=(char*)malloc(sizeof(struct list))
while (temp->nextlist != NULL) {

    strcpy(temp->quadlist->fourth, z);
    temp = l->nextlist;
}
strcpy(temp->quadlist->fourth, z);

free(temp);
free(l);

}
即使我只保留

while (l->nextlist != NULL) {

strcpy(l->quadlist->fourth, z);
l = l->nextlist;
}
strcpy(l->quadlist->fourth, z);
free(l);
第二部分,它也是一个断层

从评论中:

//z=(char*)malloc(sizeof(struct list))

看起来您为z分配了内存,但它变成了一个以非NULL结尾的字符串。所以strcpy一直在复制,最终开始读取z的末尾。在strcpy创建temp并为其及其组件分配内存之前,请检查z中的内容,但在创建temp并为其组件分配内存时,请将其丢弃所以所有这些调用都会泄漏内存,因为您从未使用分配的内存或释放内存。函数末尾对
free
的两个调用是错误的,temp不再指向您分配的内存,您也不会释放temp结构中分配的其他内存。释放l会破坏你试图更新的列表的头条——我很确定;这不是你想要的

当您执行
temp=l您失去了对刚刚分配的所有内存的引用,现在l和temp指向同一个“struct list”

您有
struct quad*next在四元结构中,但当列表结构将四元链接到列表中时,这是为了什么

您的while循环在我看来是错误的-
temp->nextlist
是您在
l->nextlist=(struct list*)malloc(sizeof(struct list))中调用malloc的结果但是你从不初始化结构,所以l->nextlist->nextlist将是垃圾,可以指向任何地方

我建议您停止查看backpatch,编写一个显示数据的函数,这样做将产生两种效果,您将知道该结构是正确的,并且您将更好地理解该结构是如何链接在一起的。你需要弄清楚结构和指针是如何组合成这样一个链表的。Google for C链表实现,并阅读一些实现链表的现有代码


您的代码实际上要做什么?

是否仔细检查了
z
指向的字符串是否大于分配的30字节。此外,您不应强制执行malloc的返回,这是常见的错误源。可能会有帮助。请确保
l
已正确初始化。因为您在分配
temp=l后在
l
上工作z指向的字符串不大于30个字节(实际上是5个字节)。。。我不太明白你不强制转换malloc的返回值是什么意思:Pi没有强制转换malloc的返回值…SEG.FAULT…:Pi应该有四个四元组(四个字符串),而*l是四元组的列表。struct list是一个结构,它有一个指向四元组的指针和一个指向列表其余部分的指针。backpatch()必须输入*l列表中的所有四元组,并将*z放入第四个字符串中。我将从顶部开始:我有一个四元组列表。这就是为什么我需要*下一个四元组结构。它们有一个从1开始的标签。现在backpatch采用一个列表结构,指向一些四边形。我想用backpatch更新这些四元组,把z放在字符*的第四个上,然后清空l,这样我以后可以放其他四元组。