【问题标题】:Make a local copy of data going into a linked-list将数据的本地副本放入链表
【发布时间】:2010-03-09 15:17:05
【问题描述】:

这不是家庭作业,只是因为我已经离开学校 20 多年了,而且我根本不需要使用链表来处理任何事情。所以我在这里没有我的元素。 反正我有

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

这是一个非常简单的链表结构。

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

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

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

杰斯。

【问题讨论】:

    标签: c linked-list


    【解决方案1】:

    你不想“复制到本地”,你想照你说的做;使用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() 都可能失败)。请注意,它是一个前置,并且返回列表的新头部。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多