我正在使用VisualStudio2010中的c ++
请解释为什么会发生这种情况:
int a, b;
int *p, *q;
cout << a << " " << b;
打印出“0 0”。嗯,这是可以理解的,未初始化的整数应为0; 但
int a, b;
int *p, *q;
p = &a;
cout << a << " " << b;
输出为“1792816880 0”
因此,如果我将指针指定给未初始化的变量,则会更改默认值。 为什么呢?
编辑澄清:问题与未初始化变量的值无关
int a; int *p;
cout << a; // would be 0, because it's loacal variable
p = &a;
cout << a; //not 0;
如何获取 a 的指针可以更改它的值? 当我们初始化变量时,我们分配空间,一些位,它们可以是任何东西,但“p =&amp; a”它实际上是否改变了这个空间中的位?
答案 0 :(得分:6)
嗯,这是可以理解的,未初始化的整数应为0
没有
无法保证,这取决于存储类,如果你的int是局部变量,它有一个自动存储,它不需要是0.
访问单元化变量会导致未定义行为,并且您的代码会导致未定义行为。一旦存在未定义的行为,所有投注都将关闭,并且无法解释行为。
关于未定义的行为,
C ++标准第1.3.24节声明:
允许的未定义行为包括完全忽略不可预测的结果,在翻译或程序执行期间以环境特征(有或没有发出诊断消息)的文件化方式行事,终止翻译或执行(发布诊断信息)。
修改强>
鉴于上述情况,这是未定义的行为,并且不应该编写任何依赖于此类行为的代码,实际上,人们甚至不应该考虑编写这样的代码。我发现它无关紧要没有资料去深入研究所有这些编译器的实现,以寻求解释为什么它以这种方式工作。
如果有人发现这个回复是强硬的,你可以自由选择。如果downvote计数超过upvotes,我会知道答案是不受欢迎的,我将删除它。
答案 1 :(得分:3)
这是C ++中的“未定义行为”。
如果不在C ++中初始化变量,它并不总是为零。那只是偶然的。分配存储器,并且先输出该存储器位置中的垃圾值,直到它被初始化为止。
答案 2 :(得分:2)
未定义未初始化值的值。没有默认值。任何价值都可以显示出来。
你做的任何看似无关的操作都可以改变软件给你的垃圾的基础价值,作为对未定义值的查询的答案。
最重要的是,不要推测应该发生什么样的未定义行为。它只是未定义 - 不要编写具有未定义行为的代码。
答案 3 :(得分:2)
这是未定义的行为,但这里有一些关于可能发生的事情的猜测:
在第一个代码示例中,从不采用变量的地址,因此编译器可能选择将它们保存在寄存器中,并且它们从不存在于主存储器中,并且寄存器的值恰好为0。
在第二个代码示例中,地址被取消,因此变量必须在内存中(在堆栈上),以便它可以有一个地址。只是现有数据存在一些随机垃圾。
答案 4 :(得分:1)
你有很多未写入的变量。编译器可能决定不为这些变量分配存储空间。这可能看起来很苛刻,但这是合理的:现代编译器在细粒度级别上分配变量存储,而某些分支上的某些变量可能未被使用。为什么在不需要时分配内存呢?
现在,如果您从没有分配内存的“变量”中读取,因为您从未写过它会发生什么?你会得到一些随机数据,很可能是另一个变量。或者是段错误 - 未定义的行为有多种形式。
现在来看你的第二个例子:在这里你做写一个变量p
。由于a
不需要任何内存分配(缺少写入),因此它可能是别名p
。 p
的值被重新解释为int
,很可能是1792816880。
答案 5 :(得分:0)
C ++不会在声明上初始化变量,只是为它们分配RAM内存。如果你使用指针,它们可以在初始化没有metter之前使用任何值。 您应该在使用前始终初始化变量。
答案 6 :(得分:0)
在C ++中,未初始化的本地整数不保证为0。它们是“垃圾”,因此它们可以是任何值,包括0。