为什么我不能在堆栈内存而不是堆上实现链表?

2022-09-24 00:00:00 singly-linked-list c++
struct node{
  int data;
  node* next;
}

int main(){
  Node *head; head->data = 999;
  Node *new_node; new_node->data = 1; head->next = new_node;
  cout << (head->next)->data;
}

此代码不起作用。如果我使用分配,它是有效的。我试着在谷歌上搜索,但没有人问这个问题。

我的代码是基于我对链表的理解。所以,尽管来烤我吧。


解决方案

创建 Node*您创建的是节点指针,而不是节点。这只是一个保存内存地址的变量,而该内存地址将保存一个节点。因为您没有分配任何内存,所以当您使用->操作符时,实际上没有节点可用。基本上,它不会在您的代码中工作,因为您正在尝试取消引用一个未初始化的指针,然后修改尚未分配的内存。

至于为什么不能用静态内存创建链表这一总体问题,这是因为堆栈上的作用域规则和自动内存管理。链表的思想是根据节点的内存地址将节点链接在一起。如果在堆栈上创建每个节点,则这些节点将在超出作用域后被删除,因此即使您保留指向其内存地址的指针,假设它们不会被其他内容覆盖也是不安全的。当然,只有当您没有将整个事情保持在相同的范围内,并且很可能不是您想要的情况下,才会出现这种情况。

相关文章