【发布时间】:2016-02-19 23:01:43
【问题描述】:
我正在尝试从 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,并在循环之前分配所有内存,但这需要知道链表中有多少元素,我希望删除最初的大小请求。
【问题讨论】:
-
请阅读
malloc,堆等 -
> 我知道我可以使用 malloc,并在循环之前分配所有内存 malloc 专门用于在初始内存量未知时分配内存。你可以在循环体中调用它
-
你不必知道列表中有多少元素,这就是为什么它被称为动态内存分配,它是在运行时完成的。只需将
cur分配更改为struct Node *cur = malloc(sizeof *cur);。 Ofc,请注意在程序结束或完成列表时释放所有分配的内存。 -
这不仅仅是内存被“重用”,而是你通过在函数返回后保留一个指向局部变量的指针来调用*未定义的行为。