我试图从c中的输入创建链接列表,如下所示:
int s;
scanf("%d", &s);
struct Node n = {0, NULL};
struct Node *prev = &n;
for (int i = 0; i < s; ++i)
{
struct Node cur = {0, NULL};
scanf((i<s-1)?"%d,":"%d", &cur.data);
//printf("%d\n", &cur);
prev->next = &cur;
prev = &cur;
}
n = *(n.next);
然而,当循环进行到下一次迭代时,似乎重新使用了cur的内存。因此,该列表包含一个自引用节点。
有没有办法阻止内存像这样重复使用?
我知道我可以使用malloc,并在循环之前分配所有内存,但这需要知道链表中有多少元素,并且我希望删除初始的大小请求。
答案 0 :(得分:3)
控制变量生命周期的唯一方法是独立于C中的范围,将其分配到动态存储中。您无法阻止重用自动变量。
在您的情况下,这意味着只需使用
struct Node *curv=malloc(sizeof(struct Node));
scanf((i<s-1)?"%d,":"%d", &cur->data);
prev->next = cur;
prev = cur;
这种方法的好处在于你不需要知道你需要多少元素。您可以一次分配一个,并在需要停止时停止。当然,这种灵活性是以分配额外指针元素为代价的。