C 制作进入链接列表的数据的本地副本
这不是家庭作业,只是我已经离开学校超过20年了,我从来没有使用过任何链接列表。所以我不在这里。 不管怎样,我有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*中,当我填充列表时,我会将指针复制到那里。 一切都
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都可能失败。请注意,这是一个前缀,并且返回了列表的新标题