我在理解我的教授作为链接列表示例的示例函数方面遇到了一些麻烦。似乎分配的内存实际上不在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不是全球性的。谢谢阅读!希望有人可以帮助我解决问题。
答案 0 :(得分:3)
malloc
是你如何分配堆内存;分配的内存一直存在,直到指针明确free
- ed。任何有权访问该指针的人都可以使用它,直到指针传递给free
。
malloc
在某种意义上不是“全局”的,它可以返回指向未在全局空间中预分配的内存的指针,但这并不意味着它分配的内存在范围内自动处理其中malloc
被称为退出。