1

我有一个非常简单的结构

 struct Node{
     Node* pNext;
     int nValue;
 };

我试图总是添加到不为空的 pNext 中。

Node *head;


void add(int nValue){
    if (!head)
    {  
        Node *node = new Node;
        node->nValue=nValue;
        head = node;
    }
    else
    {
        add(head,nValue);
    }
}

void add(Node *pNode, int nValue){
    if (!(pNode->pNext))
    {
        Node *node = new Node;
        node->nValue=nValue;
        pNode->pNext = node;
    }
    else
    {
        add(pNode->pNext,nValue);
    }
}

当我调用 add(10); 第一次,它将头指针设置为实例化节点。但是当我再次调用该方法时 add(9); 我收到“访问冲突读取位置 0xCDCDCDCD”。

我的问题是,我如何检查 pNext 节点是否分配了地址?我尝试使用 == nullptr 但无济于事。

4

4 回答 4

4

您没有初始化 pNext 指针,因此它可能具有一些随机值。

尝试使用此声明:

 struct Node{
   //Default constructor, which sets all values to something meaningful
   Node():pNext(nullptr), nValue(0) {}

   Node* pNext;
   int nValue;
 };
于 2013-09-02T15:00:50.550 回答
0

将您的代码更改为:

Node *head;


void add(int nValue){
    if (!head)
    {  
        Node *node = new Node;
        node->nValue=nValue;
        **node->pNext =NULL;**
        head = node;
    }
    else
    {
        add(head,nValue);
    }
}

void add(Node *pNode, int nValue){
    if (!(pNode->pNext))
    {
        Node *node = new Node;
        node->nValue=nValue;
        **node->pNext =NULL;**
        pNode->pNext = node;
    }
    else
    {
        add(pNode->pNext,nValue);
    }
}
于 2013-09-02T15:01:17.303 回答
0

您忘记了在新创建的节点中设置headNULL开头和设置pNext为。NULL

与 Java 等不同,C++ 不会自动将变量初始化为 0(或等效值)。

于 2013-09-02T15:01:44.803 回答
0

您需要通过在的构造函数中显式pNext设置它来正确初始化。始终处于访问未初始化内存的指示器中。nullptrnode0xCDCDCDCD

于 2013-09-02T15:01:55.320 回答