2016-03-27 29 views
1

如果我运行下面的代码,它显示一个很长的数字。为什么unassigned int有一个值?

int i;  
int *p;  
p= &i;  
cout<<*p; 

为什么unassigned int有一个值?那价值是什么?

+3

未定义,但最常见的情况是在那里。 – Thomas

+6

为什么要在这里引入'p'?你也可以发布'int i; cout << i;'。 – WhozCraig

回答

-1

变量i的内存位置(堆栈中)的当前内容。

4

因为这是“未定义行为”在C++中的意思。

“未定义的行为”意味着“任何事情都是可能的”。这包括:

  • 您得到一些对象的随机值。每次运行代码时,它总是可以相同或不同。

  • 该程序崩溃。

  • 您的计算机开始播放最新的贾斯汀比伯视频,无法自行停止播放。

  • 如你所知,宇宙即将结束。

etc ......这就是“未定义行为”的含义。

+0

虽然代码段中存在UB,但OP询问为什么*指针*有一个值,而不是为什么指向的对象有一个值。 –

+0

@TheodorosChatzigiannakis:标题和代码阐明他实际上在询问'int',最后一句话只是措辞不佳。 –

+3

人们可以停止制造关于UB的蹩脚笑话吗? – Lumen

5

指针p的值是int i的地址。您为其分配的地址为&运营商:p = &iint i本身并未初始化,也称为默认初始化。当您使用*p取消引用您的指针时,您将获得未初始化的值int i,这可能是任何值。

您的int i的值是未初始化的内存,解释为int。使用未初始化的变量是未定义的行为。

你也将有没有一个指向相同的行为通过简单地做:

int i; 
cout << i; 
+1

或多或少正确,但未初始化的本地值不是该内存位置的剩余位 - 值为* indeterminate *。不确定的事实是调用未定义的行为,因为你在最后正确地声明。就编译器而言,未初始化的局部变量可能不存在。 –

+0

@TheodorosChatzigiannakis感谢您指出这一点。我会相应地编辑答案。 – robsn

+1

虽然也值得注意的是,如果该类型特别是'unsigned char',它仍然是不确定的,但它不一定是UB来读取它。 –

0

仅仅是因为内存位置是有一定的价值(这是任何值)。正如Sam指出的那样,这是一个未定义(和不需要)行为的好例子。

0

因为变量不能为空。

计算机内存的每个字节总是包含一些内容。

计算机程序通常不会清理内存(出于速度的原因),因此,当您保留一个未初始化的变量时,它将有一些随机(或多或少)的值留在这个地方内存由另一个程序或我们自己的代码。

通常它是0或最近被破坏的某个其他变量或某个内部指针的值。

1

想象一下,你想买一块土地,你打算建一座房子。要购买土地,请联系当地土地卖方。

enter image description here

你需要告诉他你的需要的土地多台。作为回报,他会告诉你这片土地的位置。

完成 - 您的土地已准备好使用。但你有没有注意到什么?土地卖方只告诉你土地的坐标。他没有对这片土地说什么。在这块土地上可能已经有了房子。甚至可能有酒店或机场。谁知道那里有什么?如果你尝试使用土地,而不是先建房子,那么你不能保证会有什么。作为土地所有者,您有责任在土地上建造一些东西,并在适当的时候使用它。

C/C++与上例相同。询问int,就像是要求一个8个单位的土地。 C/C++会给你土地,告诉你它的坐标。它不会告诉你这块土地是什么。你有责任使用这块土地把房子放在屋顶上。如果你没有放置房子,并尝试进入“房子”,你可能会在机场结束。希望现在更清楚:)。

相关问题