c++ - 如果我不使用“new”关键字,为什么会出现分段错误?
问题描述
以下代码生成分段错误。如果我在堆上为我的 node1 分配内存,我不会遇到分段错误。( Node* node1 = new Node
)。我的问题是为什么我现在会出现分段错误?line不应该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 行时,错误就会回来。谁能解释这种行为?
解决方案
line不应该在堆栈上
Node* node1;
为我获取内存吗?node1
Node* node1;
在堆栈上为指针获取内存node1
。但是,在那之后,指针node1
未初始化并且没有指向任何有效的地方。这就是为什么您需要在更改它指向的数据之前使其指向某个有效的位置,而这样做的一种方法是使用new
.
推荐阅读
- excel - 如何自动过滤然后仅复制和粘贴可见单元格
- angularjs - 加载服务数据并在 fullCalendar 中显示使用 AngularJS 和 FullCalendar
- java - 为什么这个测试 junit 测试返回 400?
- python - Python 和 Tweepy:CSV 文件中的结果
- android - 在运行时将文本视图添加到 relativlayout
- swift - 从文本字段输入在现有表中创建新行。SwiftUI(故事板)
- r - RStudio README.Rmd 和 README.md 都应该分阶段使用'git commit --no-verify'来覆盖这个检查
- azure-data-lake - ADLS 是否支持符号或别名?
- c# - datagridview c#的参数超出范围异常
- android - 未使用导航组件将片段添加到后台堆栈