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,看起来像一个地址。
答案 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]