节点指向自己

时间:2014-08-25 17:39:10

标签: c++ linked-list

struct node
{
    node(int val,node * a = NULL,node*b= NULL):previous(a),next(b),value(val){}
    ~node(){cout << "value " << value << " is being freed\n";}
    node * previous;
    node * next;
    int value;
} ;

int main()
{

 node * some;
 some = new node(10,some,some);

 cout << some->next->value << endl;

return 0;
}

为什么这个简单的代码无法打印出来? some->next应该解析为应该有权访问的some地址。我错过了什么?也许在构造对象时,它无法正确赋值some?它输出-1916565246,看起来像一个地址。

2 个答案:

答案 0 :(得分:3)

当您将some传递给构造函数时,它尚未初始化。它只会在构造函数退出后初始化为new返回的值。

C ++中的一个unitialised变量具有不确定的值,并且从中读取它是未定义的。您最有可能看到内存的内容恰好位于为some保留的空间中。

答案 1 :(得分:2)

It outputs -1916565246 which looks like an address. 这不是一个地址。请注意,当some传递给构造函数时,它有一些垃圾值,比如说&#39; g&#39;。现在上一个和下一个被分配了&#39;以及您正在查看的内容是存储在&#39; g&#39;。我们知道,指针没有默认值。因此,&#39; g&#39;可能不是一个合法的地址,这也可能是段落错误。

我已经学会了观察从类似(糟糕)体验初始化NULL的所有指针的做法。

值得一提的是,您实际上可以使用编译器指出您遇到的麻烦。 只需使用选项-Wall

进行编译
axiom@a1:~/MultirExperiments$ g++ t.cpp -Wall
t.cpp: In function ‘int main()’:
t.cpp:16:30: warning: ‘some’ is used uninitialized in this function [-Wuninitialized]