检查结构中的指针是否为空

时间:2013-09-02 14:54:48

标签: c++ pointers struct null nullptr

我有一个非常简单的结构

 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);第一次,它将头指针设置为实例化的节点。但是当我再次调用该方法时添加(9);我得到一个“访问冲突读取位置0xCDCDCDCD”。

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

4 个答案:

答案 0 :(得分:4)

你没有初始化pNext指针,所以它可能有一些随机值。

尝试使用此声明:

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

   Node* pNext;
   int nValue;
 };

答案 1 :(得分: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);
    }
}

答案 2 :(得分:0)

您忘了将head设置为NULL开始,并在新创建的节点中将pNext设置为NULL

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

答案 3 :(得分:0)

您需要在pNext的构造函数中明确地将nullptr设置为node来正确初始化0xCDCDCDCD。 {{1}}始终是访问未初始化内存的指标。