在c中退出范围时阻止内存重用

时间:2016-02-19 23:01:44

标签: c memory

我试图从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,并在循环之前分配所有内存,但这需要知道链表中有多少元素,并且我希望删除初始的大小请求。

1 个答案:

答案 0 :(得分:3)

控制变量生命周期的唯一方法是独立于C中的范围,将其分配到动态存储中。您无法阻止重用自动变量。

在您的情况下,这意味着只需使用

struct Node *curv=malloc(sizeof(struct Node));
scanf((i<s-1)?"%d,":"%d", &cur->data);
prev->next = cur;
prev = cur;

这种方法的好处在于你需要知道你需要多少元素。您可以一次分配一个,并在需要停止时停止。当然,这种灵活性是以分配额外指针元素为代价的。