我在理解教授给出的链接列表示例函数时遇到了一些困难。似乎分配的内存实际上不在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
的范围退出时,它分配的内存会被自动处理。