这个不是家庭作业,只是我已经离开学校超过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 *复制到局部变量中。
虽然解释如何执行此操作以及为什么我的代码不好,但我更喜欢代码和解释。 谢谢。
尔杰斯。
答案 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 ,并且会返回列表的新头部。