我有一个四边形的列表,它们有一个从1开始的标签。后面的补丁是一个指向一些四边形的列表结构。我希望backpatch更新这些四元组,将z放在char *第四,然后清空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);部分,它也是seg.fault...
发布于 2014-04-29 22:18:24
来自评论:
//z=(char*)malloc(sizeof(struct list))看起来您为z分配了内存,但它变成了一个非NULL终止的字符串。因此strcpy一直在复制,并最终开始读取超过z结尾的内容。
发布于 2014-04-29 22:18:48
您创建临时并为它和它的组件分配内存,但是当您执行temp = l;时,您会丢弃它,所以所有这些调用都会泄漏内存,因为您从未使用过您分配的内存或释放它。在函数末尾对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链表实现,并阅读一些实现链表的现有代码。
你的代码到底想做什么?
https://stackoverflow.com/questions/23367163
复制相似问题