根据c ++上的任何一本书,任何未初始化的c ++局部变量都将包含一个垃圾值.但是,请查看以下程序:
#include<iostream>
using namespace std;
float a;
class A
{
public:
float b;
};
int main()
{
float c;
static float d;
static float e = 0;
A f;
cout<<"\n global a : "<<a<<"\n class variable b : "<<f.b;
cout<<"\n local c : "<<c<<"\n static local d : "<<d
<<"\n static initialized local e : "<<e;
}
Run Code Online (Sandbox Code Playgroud)
如果在ubuntu linux上使用g ++编译,它会提供以下输出:
global a : 0
class variable b : 6.94896e-36
local c : 0
static local d : 0
static initialized local e : 0
Run Code Online (Sandbox Code Playgroud)
奇怪的是它为局部变量c提供了一个0值,而这应该是未初始化的并包含一些垃圾值.相同的程序与visual c ++ for windows的工作方式不同,并为c提供了垃圾值,这是你所期望的.
Jam*_*lis 10
局部变量c是左初始化.正如您所说,这意味着它具有垃圾值. 对象可以具有任何值,包括0.零是有效的"垃圾价值".通常,不允许您从尚未初始化的对象中读取.
为什么值c为零?可能是编译器(g ++)在输入函数时对堆栈进行零初始化,以"帮助"程序"正确"执行,即使它使用了未初始化的变量.或者,可能是操作系统在将内存页面提供给您的程序之前将其初始化为零.或者,可能是main在现在占用的字节数组中将值零存储之前调用的函数c,因此它具有零值.
使用Visual C++编译的二进制文件的行为取决于它的编译方式.在发布二进制文件中,性能比可调试性更重要,在输入函数时不会隐式初始化堆栈,因此c将保持未初始化并具有垃圾值.
在调试二进制文件中,可调试性更重要,所有局部变量都使用字节进行初始化0xcc.这可以帮助您跟踪和调试未初始化变量的使用情况.类似地,调试堆使用该字节初始化新分配的存储0xcd,并且在分配和解除分配时,它使用不同的位模式填充内存,以帮助您调试程序的状态.
| 归档时间: |
|
| 查看次数: |
2341 次 |
| 最近记录: |