如果我不使用"新"关键字,为什么会出现细分错误?



以下代码生成分段错误。如果我在堆上为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行时,错误就会回来。有人能解释这种行为吗?

Node* node1;行不应该为堆栈上的node1获取内存吗?

Node* node1;在堆栈上获取指针node1的内存。然而,在那之后,指针node1未初始化,并且没有指向任何有效的位置。这就是为什么在更改它所指向的数据之前,需要将它指向某个有效的位置,其中一种方法是使用new

问题:为什么我现在会出现分段错误?

答案:每当我们访问程序段中的内存时,我们都会出现分段错误。

问题:节点*node1不应该;在上为我的node1获取内存堆栈

答案:1.在Node * node1;中,node1只是指针类型的变量,它将指向Node对象。node1指针大小不取决于Node结构的成员。它在32位操作系统/平台中只有4字节长。此指针变量应仅用于存储地址指针类型在此为CCD_ 10。

  1. 当前它持有的垃圾值。

  2. 我们必须使用"Node *node1 = new Node;"或本地(非动态(创建类型为Node的对象(分配内存(为"Node node1;",现在我们可以使用->(指向成员的指针(运算符或使用来访问为Node创建的内存。(点(运算符。

问题:我打印了node1的地址,添加了一行cout?

答案:您打印的是指针变量的地址,而不是Node对象。

问题:每当我评论cout行时,错误就会回来。可以有人解释这种行为吗?

答案:1。行为将是不可预测的,因为您正在使用垃圾地址(存在于node1指针变量中(。

  1. 如果指针变量(垃圾(指向其他进程保护/使用的内存,则我们将出现分段错误。

  2. 如果垃圾地址指向尚未被其他进程使用/保护的内存,我们可能不会得到任何错误。

我希望现在一切都清楚了。如果有任何后续问题,请告诉我。

为了使用对象,必须存在构造函数,并在实例化对象时使用该构造函数。如果不提供任何构造函数,编译器可以在某些条件下隐式定义构造函数,但最终,如果希望实例化对象,则构造函数必须存在。

相关内容

  • 没有找到相关文章

最新更新