C++ 简单C++;一旦使用节点指针,程序就会崩溃
所以我从来没有真正学习过图论,但我看过一些例子,所以我想自己尝试一下。我做了一个简单的程序,看起来像这样:C++ 简单C++;一旦使用节点指针,程序就会崩溃,c++,memory,C++,Memory,所以我从来没有真正学习过图论,但我看过一些例子,所以我想自己尝试一下。我做了一个简单的程序,看起来像这样: struct node { node* prev; node* next; int num = 0; /*node() { prev = new node(); next = new node(); }*/ }; int main() { node* curr = new node(); curr->num =
struct node
{
node* prev;
node* next;
int num = 0;
/*node()
{
prev = new node();
next = new node();
}*/
};
int main()
{
node* curr = new node();
curr->num = 1;
curr->prev = curr;
curr = curr->next;
curr->num = 2;
return 0;
}
当我取消对构造函数的注释时,它在main()的第一行崩溃。当它被注释掉时,它会崩溃“curr->num=2;”行。我不知道为什么会这样,我想知道。谢谢
node()
{
prev = new node();
next = new node();
}
创建新节点时,将再创建两个节点。这个过程永远不会停止,它是一个递归的过程
创建新节点时,将再创建两个节点。这个过程永远不会停止,它是一个递归的构造函数。您的第一个问题是UKMonkey提到的 第二个是
curr = curr->next;
curr->num = 2;
在移动到
curr->next
后,您不会将内存分配给next,因此您无法将值分配给尚未初始化的位置。您的第一个问题是UKMonkey提到的
第二个是
curr = curr->next;
curr->num = 2;
在移动到
curr->next
后,您不会将内存分配给next,因此您无法将值分配给尚未初始化的位置。实际上,程序在cum->num=2
处崩溃,因为您已将curr设置为curr->next
为空
如果取消对ctor的注释,程序将再次崩溃,因为您正在创建一个无限的初始化循环。看看stacktrace:
我可以举一个有效的例子:
struct node
{
node* prev;
node* next;
int num = 0;
};
int main()
{
node* curr;
// Make a root node:
node* root = new node();
root->num = 1;
// Create a child node
root->next = new node();
// Set '2' at the child node
curr = root->next;
curr->num = 2;
// Create a child of the child node
curr->next = new node();
// Set '3' at the child node of the child node
curr = curr->next;
curr->num = 3;
// Etc...
return 0;
}
调试它以更好地理解:
实际上,程序在
cum->num=2时崩溃,因为您将curr设置为curr->next
,该值为空
如果取消对ctor的注释,程序将再次崩溃,因为您正在创建一个无限的初始化循环。看看stacktrace:
我可以举一个有效的例子:
struct node
{
node* prev;
node* next;
int num = 0;
};
int main()
{
node* curr;
// Make a root node:
node* root = new node();
root->num = 1;
// Create a child node
root->next = new node();
// Set '2' at the child node
curr = root->next;
curr->num = 2;
// Create a child of the child node
curr->next = new node();
// Set '3' at the child node of the child node
curr = curr->next;
curr->num = 3;
// Etc...
return 0;
}
调试它以更好地理解:
如果你不让next指向任何东西,它指向什么?你认为这里会发生什么:curr=curr->next代码>?未初始化成员prev
和next
cur=cur->next
为cur
指定一个未初始化的值。我不确定您希望它包含什么,这将导致下面的curr->num
做任何有意义的事情。如果您不让它指向任何东西,下一步指向什么?您认为这里会发生什么:curr=curr->next代码>?未初始化成员prev
和next
cur=cur->next
为cur
指定一个未初始化的值。我不确定您希望它包含什么,这将导致下面的curr->num
执行任何有意义的操作。啊哈。我懂了。那么,有没有一种快速的方法可以自动初始化它们呢?还是太复杂了?当您将指针移动到下一个节点时,请执行另一个curr=new node()
,然后执行curr->num=2
,前提是您修复了前面的问题。啊哈。我懂了。那么,有没有一种快速的方法可以自动初始化它们呢?还是太复杂了?当您将指针移动到下一个节点时,请执行另一个curr=new node()
,然后执行curr->num=2
,前提是您修复了前面的问题。谢谢!我看了一遍,似乎明白问题出在哪里。现在谈论上一个节点,我是否需要设置某种临时节点,我将其设置为当前节点,然后在将curr指针移动到下一个节点后使用它初始化上一个节点?我不确定我是否理解正确,但是。。。您可以使用指针对节点进行操作。”“curr”指针当前位于第三级子节点。看这条线:19和25!但整个节点结构的根都指向“根”节点curr'只是一个实用程序指针。您可以将该指针设置为结构的任何节点。谢谢!我看了一遍,似乎明白问题出在哪里。现在谈论上一个节点,我是否需要设置某种临时节点,我将其设置为当前节点,然后在将curr指针移动到下一个节点后使用它初始化上一个节点?我不确定我是否理解正确,但是。。。您可以使用指针对节点进行操作。”“curr”指针当前位于第三级子节点。看这条线:19和25!但整个节点结构的根都指向“根”节点curr'只是一个实用程序指针。可以将该指针设置为指向结构的任何节点。