【问题标题】:preventing memory reuse upon exiting scope in c在c中退出范围时防止内存重用
【发布时间】: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,请注意在程序结束或完成列表时释放所有分配的内存。
  • 这不仅仅是内存被“重用”,而是你通过在函数返回后保留一个指向局部变量的指针来调用*未定义的行为。

标签: c memory


【解决方案1】:

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

在你的情况下,这意味着简单地使用

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-08
    • 1970-01-01
    • 2015-11-22
    • 2012-06-04
    • 2022-12-15
    相关资源
    最近更新 更多