【问题标题】:Scope of memory using linked list functions使用链表函数的内存范围
【发布时间】:2016-08-27 18:01:40
【问题描述】:

我在理解我的教授作为链表示例给出的示例函数时遇到了一些困难。似乎分配的内存实际上不在main的范围内。但它似乎工作。以下是示例函数:

#define NEW(x) (x*)malloc(sizeof(x))

NODE *make_node (void *data) {
    NODE *temp;

    temp = NEW(NODE);
    if (temp != NULL) {
        temp->data = data;
        temp->next = NULL;
    }

    return temp;
}

int insert_at_tail(ROOT *r, DATA *d) {
    NODE *temp;

    temp = make_node(d);

    if (temp == NULL)  // fail, cannot create new NODE
        return -1;

    if (r == NULL) {
        r = make_root();
        if (r == NULL) // fail, cannot create ROOT
            return -1;
    }

    (r->num)++;

    if (r->num == 1) {             // if previously the list is empty
        r->head = r->tail = temp;
    }
    else {
        r->tail->next = temp;
        r->tail = temp;
    }

    return 0;
}

在我看来,函数 insert_at_tail 调用 make_node 函数,然后在函数 insert_at_tail 中返回一个内存位置。但是那个内存位置在那个函数的范围内吗?然后将内存分配给链表数据。为什么在主函数中链表数据仍然可以访问该内存?我认为 malloc 不是全球性的。谢谢阅读!希望有人能帮我解惑。

【问题讨论】:

  • 顺便说一句 r = make_root(); 也许这不起作用。

标签: c linked-list malloc


【解决方案1】:

malloc 是你分配堆内存的方式;分配的内存一直存在,直到指针明确地free-ed。任何有权访问该指针的人都可以使用它,直到将指针传递给 free

malloc 不是“全局”的,因为它可以返回指向未在全局空间中预分配的内存的指针,但这并不意味着它分配的内存在malloc 被称为退出。

【讨论】:

    猜你喜欢
    • 2011-05-19
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-24
    • 2013-01-23
    • 2022-01-11
    • 2013-05-01
    相关资源
    最近更新 更多