如果我运行下面的代码,它显示一个很长的数字。为什么unassigned int有一个值?
int i;
int *p;
p= &i;
cout<<*p;
为什么unassigned int有一个值?那价值是什么?
如果我运行下面的代码,它显示一个很长的数字。为什么unassigned int有一个值?
int i;
int *p;
p= &i;
cout<<*p;
为什么unassigned int有一个值?那价值是什么?
变量i的内存位置(堆栈中)的当前内容。
因为这是“未定义行为”在C++中的意思。
“未定义的行为”意味着“任何事情都是可能的”。这包括:
您得到一些对象的随机值。每次运行代码时,它总是可以相同或不同。
该程序崩溃。
您的计算机开始播放最新的贾斯汀比伯视频,无法自行停止播放。
如你所知,宇宙即将结束。
etc ......这就是“未定义行为”的含义。
虽然代码段中存在UB,但OP询问为什么*指针*有一个值,而不是为什么指向的对象有一个值。 –
@TheodorosChatzigiannakis:标题和代码阐明他实际上在询问'int',最后一句话只是措辞不佳。 –
人们可以停止制造关于UB的蹩脚笑话吗? – Lumen
指针p
的值是int i
的地址。您为其分配的地址为&
运营商:p = &i
。 int i
本身并未初始化,也称为默认初始化。当您使用*p
取消引用您的指针时,您将获得未初始化的值int i
,这可能是任何值。
您的int i
的值是未初始化的内存,解释为int
。使用未初始化的变量是未定义的行为。
你也将有没有一个指向相同的行为通过简单地做:
int i;
cout << i;
或多或少正确,但未初始化的本地值不是该内存位置的剩余位 - 值为* indeterminate *。不确定的事实是调用未定义的行为,因为你在最后正确地声明。就编译器而言,未初始化的局部变量可能不存在。 –
@TheodorosChatzigiannakis感谢您指出这一点。我会相应地编辑答案。 – robsn
虽然也值得注意的是,如果该类型特别是'unsigned char',它仍然是不确定的,但它不一定是UB来读取它。 –
仅仅是因为内存位置我是有一定的价值(这是任何值)。正如Sam指出的那样,这是一个未定义(和不需要)行为的好例子。
因为变量不能为空。
计算机内存的每个字节总是包含一些内容。
计算机程序通常不会清理内存(出于速度的原因),因此,当您保留一个未初始化的变量时,它将有一些随机(或多或少)的值留在这个地方内存由另一个程序或我们自己的代码。
通常它是0或最近被破坏的某个其他变量或某个内部指针的值。
想象一下,你想买一块土地,你打算建一座房子。要购买土地,请联系当地土地卖方。
你需要告诉他你的需要的土地多台。作为回报,他会告诉你这片土地的位置。
完成 - 您的土地已准备好使用。但你有没有注意到什么?土地卖方只告诉你土地的坐标。他没有对这片土地说什么。在这块土地上可能已经有了房子。甚至可能有酒店或机场。谁知道那里有什么?如果你尝试使用土地,而不是先建房子,那么你不能保证会有什么。作为土地所有者,您有责任在土地上建造一些东西,并在适当的时候使用它。
C/C++与上例相同。询问int
,就像是要求一个8个单位的土地。 C/C++会给你土地,告诉你它的坐标。它不会告诉你这块土地是什么。你有责任使用这块土地把房子放在屋顶上。如果你没有放置房子,并尝试进入“房子”,你可能会在机场结束。希望现在更清楚:)。
未定义,但最常见的情况是在那里。 – Thomas
为什么要在这里引入'p'?你也可以发布'int i; cout << i;'。 – WhozCraig