分配指向未初始化变量的指针会改变它的值吗?

Vil*_*ler 3 c++ pointers visual-studio-2010

我在VisualStudio2010中玩c ++

请解释IT发生的原因:

int a, b;
int *p, *q;
cout << a << " " << b;
Run Code Online (Sandbox Code Playgroud)

打印出"0 0".嗯,这是可以理解的,未初始化的整数应为0; 但

int a, b;
int *p, *q;
p = &a;
cout << a << " " << b;
Run Code Online (Sandbox Code Playgroud)

输出为"1792816880 0"

因此,如果我将指针指定给未初始化的变量,则会更改默认值.为什么?

编辑澄清:问题不是关于未初始化变量的值

int a; int *p;
cout << a; // would be 0, because it's loacal variable
p = &a;
cout << a; //not 0;
Run Code Online (Sandbox Code Playgroud)

如何获得的指针一个可以改变它的价值?当我们初始化变量时,我们分配空间,一些位,它们可以是任何东西,但"p =&a"它实际上是否改变了这个空间中的位?

Alo*_*ave 6

嗯,这是可以理解的,未初始化的整数应为0

没有.

不能保证,它取决于存储类,如果你的int是局部变量,它有一个自动存储,它不需要是0.

访问Unitialized变量会导致未定义的行为,并且您的代码导致未定义的行为.一旦存在未定义的行为,所有投注都将关闭,并且无法解释该行为.

关于未定义的行为,

C++标准第1.3.24节规定:

允许的未定义行为包括完全忽略不可预测的结果,在翻译或程序执行期间以环境特征(有或没有发出诊断消息)的特定行为,终止翻译或执行(发布时)一条诊断信息).

编辑:
鉴于上述情况,这是未定义的行为,并且不应该编写任何依赖于此类行为的代码,实际上,人们甚至不应该考虑编写这样的代码.我发现深入研究所有这些编译器的实现以寻求解释为什么它以这种方式工作是不相关和无效的.

如果有人发现这个回复是顽固的,你可以自由选择.如果downvote计数超过upvotes,我会知道答案是不受欢迎的,我将删除它.

  • @Als:C++是一种语言,而不是一种实现.你的"这是未定义的行为,不要这样做"的方法对于"X似乎在C++中工作,我应该这样做吗?"这一形式的问题很好,但不是在这里.这个代码*可以解释,你只需要更务实.我认为一个合适的答案是"首先,不要这样做.读取未初始化的变量是UB,你不应该依赖于UB.那就是说,这就是为什么两个看似无关的东西是相关的......" (5认同)
  • 我认为问题是,标准*无法解释行为*.正如GMan所说,可以参考实现细节来解释特定实现(或许多实现)的行为.熟悉Visual Studio 2010的人(或者只是看看发出的代码)可以解释为什么会发生这种情况.有时您甚至可以预测垃圾价值...... (4认同)
  • 这是一个警察.任何人都可以显示*为什么*它在Visual Studio和GNU编译器下都这样做? (3认同)
  • @trojanfoe这是唯一可能的答案.程序的行为是未定义的,因此几乎任何事情都可能发生. (2认同)

归档时间:

查看次数:

1433 次

最近记录:

14 年,1 月 前