将数据的本地副本放入链接列表中

时间:2010-03-09 15:17:06

标签: c linked-list

这个不是家庭作业,只是我已经离开学校超过20年的事实,我从来没有必须使用链接列表任何东西。所以我不在这里。 无论如何,我有

struct Data_Struct {
    char *Name;
    char *Task;
    char *Pos;
    struct Data_Struct *Next;
};
typedef struct Data_Struct MyData;

对于链表来说,这是一个非常简单的结构。

正如您所看到的,数据存储在char *中,当我填充列表时,我将指针复制到那里。 一切都很好。当这些指针被覆盖并丢失原始数据时,问题就开始了。我尝试将数据复制到每个“list_add()”上的本地char * malloc'ed但我继续崩溃或丢失数据。 是的,我确实分配足够的,是的,我会复制数据并检查它是否正确复制。我尝试使用memcpy,strcpy等等。

我没有尝试,所以我的问题是,如何确保我将添加到列表中的数据是本地的。如何将列表中的char *复制到局部变量中。

虽然解释如何执行此操作以及为什么我的代码不好,但我更喜欢代码和解释。 谢谢。

尔杰斯。

1 个答案:

答案 0 :(得分:4)

你不想“复制到本地”,你想要像你说的那样做;使用malloc()分配新内存,将数据存储在那里,并将指针保存在列表节点中。

如果您拥有它,可以使用strdup()malloc() + strcpy()合并为一个电话。

很难理解在什么情况下您会遇到数据被覆盖的情况,您对列表节点做了什么导致这种情况?

对于您的节点定义,基本前置应该如下所示:

MyData * list_prepend(MyData* head, const char *name, const char *task,
                  const char *pos)
{
  MyData *node = malloc(sizeof *node);
  node->Name = strdup(name);
  node->Task = strdup(task);
  node->Pos = strdup(pos);
  node->Next = head;
  return node;
}

显然这缺乏错误处理(malloc()strdup()都可能失败)。请注意,它是 prepend ,并且会返回列表的新头部。