繁体   English   中英

strcpy分割错误

[英]strcpy segmentation fault

我有一个四边形列表,并且它们的标签从1开始。backpatch采用了指向某些四边形的列表结构。 我想backpatch更新那些四边形,将z放在char *上,然后清空l,这样我以后可以放其他四边形。尽管我已经为char * zchar * fourth four分配了内存,但在backpatch的strcpy seg.fault了seg.fault。 有人知道为什么会这样吗?

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的末尾。 检查z befor strcpy中的内容

您创建temp并为其及其组件分配内存,但是当temp = l;时,您将其丢弃temp = l; 因此,所有这些调用都会泄漏内存,因为您从不使用分配或释放的内存。 函数末尾的两次free调用是错误的,temp不再指向您分配的内存,并且您不释放temp结构内分配的其他内存。 释放l会破坏您尝试更新的列表的开头-我很确定那不是您想要的。

当你做temp = l; 您松开了对刚分配的所有内存的引用,现在l和temp指向相同的“结构列表”

你有struct quad *next; 在四边形结构中,但是当您的列表结构将四边形链接到列表中时,这是做什么用的?

你的while循环对我来说似乎是错误的temp->nextlist是您在l->nextlist = (struct list*) malloc(sizeof (struct list));调用malloc的结果l->nextlist = (struct list*) malloc(sizeof (struct list)); 但是您永远不会初始化结构,因此l-> nextlist-> nextlist将是垃圾,可能指向任何地方。

我建议您不要再看backpatch,而是编写一个显示数据的函数,这样做会产生两种效果,您将知道结构是正确的,并且将更好地了解结构如何链接在一起。 您需要了解结构和指针如何组合以创建这样的链接列表。 Google for C链表实现,并阅读一些实现链表的现有代码。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM