strcpy分段错误

时间:2014-04-29 14:12:17

标签: c struct segmentation-fault strcpy

我有一个四边形列表,它们有一个从1开始的标签。后台采用一个列表结构,指向一些四边形。我希望backpatch更新这些四边形,将z放在char *第四个然后清空l所以我可以稍后放入其他四边形。我在后台补充seg.fault strcpy虽然我已经分配了内存对于char * zchar * 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 ......

2 个答案:

答案 0 :(得分:0)

来自评论:

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

看起来你为z分配了内存,但它变成了一个非NULL终止的字符串。所以strcpy一直在复制并最终开始读取z的结尾。检查z befor strcpy中的内容

答案 1 :(得分:0)

你创建temp并为它及其组件分配内存,但是当你执行temp = l;时你就扔掉它所以所有这些调用都会泄漏内存,因为你从不使用你分配的内容或释放它。在函数末尾对free的两次调用是错误的,temp不再指向您分配的内存,并且您不会释放临时结构内分配的其他内存。释放l会破坏你想要更新的列表的头部 - 我很确定;这不是你想要的。

当你执行temp = l;时,你对你刚刚分配的所有记忆都失去了反抗,现在l和temp指向相同的结构列表'

你在四元结构中有struct quad *next;,但是你的列表结构将四边形链接到一个列表中这是什么?

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

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

您的代码实际上在尝试做什么?