【发布时间】:2019-11-13 14:29:33
【问题描述】:
以下代码会产生分段错误。如果我在堆上为我的 node1 分配内存,我不会遇到分段错误。 (Node* node1 = new Node)。我的问题是为什么我现在会出现分段错误? Node* node1; 行不应该在堆栈上为我的 node1 获取内存吗?
class Node{
public:
int data;
Node* next;
};
int main(){
Node* node1;
node1->data = 5;
cout << node1->data << endl;
}
我打印了 node1 的地址并添加了一条 cout 行:
int main(){
Node* node1;
cout << &node1 << endl;
node1->data = 5;
cout << node1->data << endl;
}
现在错误消失了。每当我评论 cout 行时,错误就会回来。谁能解释这种行为?
【问题讨论】:
-
node1未初始化 -
详细来说,
Node*是Node在内存中的地址。如果你不初始化它,它将指向任何旧地址。因此,当您尝试访问那里的节点时,操作系统会伸出手臂并发出段错误,因为您正在尝试访问您无权访问的内存段。 -
@parktomatomi 我编辑了这个问题。所以试图到达指针的地址给了我权限,对吗?这是错误消失的原因吗?
-
谁能解释这种行为? 这就是未定义的行为。当您违反语言规则时,任何事情都可能发生。
-
@NoN 只有操作系统可以任意访问内存中的地址。您的程序在所谓的用户空间中运行,因此您必须向操作系统询问您可以访问的内存块。这就是
new在幕后所做的。
标签: c++ linked-list segmentation-fault