【问题标题】:strcpy segmentation faultstrcpy 分段错误
【发布时间】:2014-06-15 12:55:39
【问题描述】:

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

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...

【问题讨论】:

  • 您是否仔细检查过z 指向的字符串不大于您分配的30 个字节。此外,您不应强制返回 malloc,这是常见的错误来源。
  • valgrind 可能会有所帮助。
  • 确保l 已正确初始化。因为你在分配temp=l; 之后在l 工作
  • z 指向的字符串不大于 30 个字节(实际上是 5 个字节)...我不完全理解不强制返回 malloc 是什么意思:P
  • 我没有强制转换 malloc 的返回值...SEG.FAULT .....:p

标签: c struct segmentation-fault strcpy


【解决方案1】:

来自评论:

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

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

【讨论】:

    【解决方案2】:

    您创建 temp 并为其及其组件分配内存,但是当您执行 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->nextlist 将是垃圾,可能指向任何地方。

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

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

    【讨论】:

    • 我假设有四边形(四个字符串)并且 *l 是一个四边形列表。 struct list 是一个结构,它有一个指向四边形的指针和一个指向列表其余部分的指针。 backpatch() 必须输入 *l 列表的所有四边形并将 *z 放入第四个字符串。
    • 我将从顶部开始:我有一个四边形列表。这就是为什么我需要 *next 在四边形结构。他们有一个从 1 开始的标签。现在,backpatch 采用了一个指向某些四边形的列表结构。我想要更新这些四边形,将 z 放在 char * 第四个,然后清空 l,这样我以后可以放置其他四边形。
    猜你喜欢
    • 1970-01-01
    • 2020-10-05
    • 2014-10-21
    • 2013-02-23
    • 2019-02-23
    • 2017-03-12
    • 2017-09-17
    • 2018-07-28
    • 2012-04-25
    相关资源
    最近更新 更多