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"它实际上是否改变了这个空间中的位?
嗯,这是可以理解的,未初始化的整数应为0
没有.
不能保证,它取决于存储类,如果你的int是局部变量,它有一个自动存储,它不需要是0.
访问Unitialized变量会导致未定义的行为,并且您的代码导致未定义的行为.一旦存在未定义的行为,所有投注都将关闭,并且无法解释该行为.
关于未定义的行为,
C++标准第1.3.24节规定:
允许的未定义行为包括完全忽略不可预测的结果,在翻译或程序执行期间以环境特征(有或没有发出诊断消息)的特定行为,终止翻译或执行(发布时)一条诊断信息).
编辑:
鉴于上述情况,这是未定义的行为,并且不应该编写任何依赖于此类行为的代码,实际上,人们甚至不应该考虑编写这样的代码.我发现深入研究所有这些编译器的实现以寻求解释为什么它以这种方式工作是不相关和无效的.
如果有人发现这个回复是顽固的,你可以自由选择.如果downvote计数超过upvotes,我会知道答案是不受欢迎的,我将删除它.
| 归档时间: |
|
| 查看次数: |
1433 次 |
| 最近记录: |