以下代码生成分段错误。如果我在堆上为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。
-
当前它持有的垃圾值。
-
我们必须使用
"Node *node1 = new Node;
"或本地(非动态(创建类型为Node的对象(分配内存(为"Node node1;
",现在我们可以使用->(指向成员的指针(运算符或使用来访问为Node创建的内存。(点(运算符。
问题:我打印了node1的地址,添加了一行cout?
答案:您打印的是指针变量的地址,而不是Node对象。
问题:每当我评论cout行时,错误就会回来。可以有人解释这种行为吗?
答案:1。行为将是不可预测的,因为您正在使用垃圾地址(存在于node1指针变量中(。
-
如果指针变量(垃圾(指向其他进程保护/使用的内存,则我们将出现分段错误。
-
如果垃圾地址指向尚未被其他进程使用/保护的内存,我们可能不会得到任何错误。
我希望现在一切都清楚了。如果有任何后续问题,请告诉我。
为了使用对象,必须存在构造函数,并在实例化对象时使用该构造函数。如果不提供任何构造函数,编译器可以在某些条件下隐式定义构造函数,但最终,如果希望实例化对象,则构造函数必须存在。