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'只是一个实用程序指针。可以将该指针设置为指向结构的任何节点。