gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 01:54:28 26 4
gpt4 key购买 nike

我在理解我的教授作为链表示例给出的示例函数时遇到了一些困难。看来分配的内存其实不在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 中的内存位置。但是那个内存位置在那个函数的范围内?然后将内存分配给链表数据。为什么在 main 函数中链表数据仍然可以访问该内存?我认为 malloc 不是全局的。谢谢阅读!希望有人能解决我的困惑。

最佳答案

malloc 是分配堆内存的方式;分配的内存一直存在,直到指针被显式释放。在指针传递给 free 之前,任何有权访问该指针的人都可以使用它。

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

关于c - 使用链表函数的内存范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36991469/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com