c-使用链表函数的内存范围



我在理解教授给出的链接列表示例函数时遇到了一些困难。似乎分配的内存实际上不在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不是全球性的。感谢阅读!希望有人能帮我解决困惑。

malloc是如何分配堆内存的;所分配的存储器一直保持直到指针被明确地CCD_ 2-ed。任何有权访问该指针的人都可以使用它,直到指针被传递给free

malloc不是"全局"的,因为它可以返回指向未在全局空间中预先分配的内存的指针,但这并不意味着当调用malloc的范围退出时,它分配的内存会被自动处理。

最新更新