C 制作进入链接列表的数据的本地副本

C 制作进入链接列表的数据的本地副本,c,linked-list,C,Linked List,这不是家庭作业,只是我已经离开学校超过20年了,我从来没有使用过任何链接列表。所以我不在这里。 不管怎样,我有 struct Data_Struct { char *Name; char *Task; char *Pos; struct Data_Struct *Next; }; typedef struct Data_Struct MyData; 这是一个非常简单的链表结构 正如您所看到的,数据存储在char*中,当我填充列表时,我会将指针复制到那里。 一切都

这不是家庭作业,只是我已经离开学校超过20年了,我从来没有使用过任何链接列表。所以我不在这里。 不管怎样,我有

struct Data_Struct {
    char *Name;
    char *Task;
    char *Pos;
    struct Data_Struct *Next;
};
typedef struct Data_Struct MyData;
这是一个非常简单的链表结构

正如您所看到的,数据存储在char*中,当我填充列表时,我会将指针复制到那里。 一切都很好。当这些指针被覆盖并且我丢失了原始数据时,问题就开始了。我尝试将数据复制到每个添加的列表的本地字符中,但我一直在崩溃或丢失数据。 是的,我确实分配了足够的数据,是的,我确实复制了数据,并检查复制是否正确。我试过用memcpy、strcpy等

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

虽然关于如何做到这一点以及为什么我的代码不好的解释是可以的,但我更喜欢有解释的代码。 多谢各位


Jess.

你不想复制到本地,你想照你说的做;使用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都可能失败。请注意,这是一个前置词,并且会返回列表的新标题。

如果您不想复制到本地,请按照您所说的操作;使用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都可能失败。请注意,这是一个前缀,并且返回了列表的新标题