CPU型号:Intel(R) Core(TM) i5-2450M
系统:windows 10
IDE:Microsoft Visual C++ 6.0(下文中简称VC)
制图软件:Photoshop cs5
在初级的编程人眼里,没有初始化的局部变量的值就是随机值!其实,在VC环境下,这句话并不是行的通的。
在VC的debug模式下,栈区变量默认以CC填充,堆区变量默认以CD填充!
先看debug版本下的以下代码:
#include <iostream>
using namespace std;
void main()
{
bool b;
char c;
short s;
long l;
int i;
float f;
double d;
unsigned u;
signed su;
cout<<"bool="<<b<<",addr=0x"<<&b<<endl;
cout<<"char="<<c<<",addr=0x"<<&c<<endl;
cout<<"short="<<s<<",addr=0x"<<&s<<endl;
cout<<"long="<<l<<",addr=0x"<<&l<<endl;
cout<<"int="<<i<<",addr=0x"<<&i<<endl;
cout<<"float="<<f<<",addr=0x"<<&f<<endl;
cout<<"double="<<d<<",addr=0x"<<&d<<endl;
cout<<"unsigned="<<u<<",addr=0x"<<&u<<endl;
cout<<"signed="<<su<<",addr=0x"<<&su<<endl;
}
运行结果:
通过调试查看内存:
由图中内存地址对应局部变量的地址上,你会惊奇的发现所有局部变量的所有字节都被CC填充!也就是说,没在VC的debug模式下,局部变量(栈Stack)默认都是以CC来填充的,并不是随机值!这样的好处就在于调试同一段代码不回因为未初始化的局部变量内的值不同而产生不同的结果,这也是VC人性化的体现!
在栈(Stack)上定义的局部变量是默认以CC来填充字节的,那在堆(Heap)上定义的局部变量又是默认以什么来填充字节呢?
测试代码:
#include <iostream>
using namespace std;
void main()
{
char *p;
p=(char *)malloc(4);
cout<<*p<<endl;
}
调试结果:
也就是说,在VC的debug版本中,堆(Heap)上定义的局部变量默认是以CD来填充字节的!
程序运行时在内存的分布总共有五块,其中代码区不能动(一般情况下),常量区变量不能定义为空,在VC的debug模式下,栈区变量默认以CC填充,堆区默认以CD填充,那静态区默认以什么填充呢?读者可以自行思考以及验证。
将版本设置成release版本,代码如下:
#include <iostream>
using namespace std;
void main()
{
bool b=0;
char c='a';
short s=1;
long l=1;
int i=1;
float f=1;
double d=1;
unsigned u=1;
signed su=1;
cout<<"bool="<<b<<",addr=0x"<<&b<<endl;
cout<<"char="<<c<<",addr=0x"<<&c<<endl;
cout<<"short="<<s<<",addr=0x"<<&s<<endl;
cout<<"long="<<l<<",addr=0x"<<&l<<endl;
cout<<"int="<<i<<",addr=0x"<<&i<<endl;
cout<<"float="<<f<<",addr=0x"<<&f<<endl;
cout<<"double="<<d<<",addr=0x"<<&d<<endl;
cout<<"unsigned="<<u<<",addr=0x"<<&u<<endl;
cout<<"signed="<<su<<",addr=0x"<<&su<<endl;
}
运行结果:
删掉初始化的值后重新运行,代码如下:
#include <iostream>
using namespace std;
void main()
{
bool b;
char c;
short s;
long l;
int i;
float f;
double d;
unsigned u;
signed su;
cout<<"bool="<<b<<",addr=0x"<<&b<<endl;
cout<<"char="<<c<<",addr=0x"<<&c<<endl;
cout<<"short="<<s<<",addr=0x"<<&s<<endl;
cout<<"long="<<l<<",addr=0x"<<&l<<endl;
cout<<"int="<<i<<",addr=0x"<<&i<<endl;
cout<<"float="<<f<<",addr=0x"<<&f<<endl;
cout<<"double="<<d<<",addr=0x"<<&d<<endl;
cout<<"unsigned="<<u<<",addr=0x"<<&u<<endl;
cout<<"signed="<<su<<",addr=0x"<<&su<<endl;
}
运行结果为:
再次运行下的结果:
结果还是不变,修改代码的初值:
#include <iostream>
using namespace std;
void main()
{
bool b=0;
char c='b';
short s=55;
long l=55;
int i=55;
float f=55.55f;
double d=55.55;
unsigned u=55;
signed su=55;
cout<<"bool="<<b<<",addr=0x"<<&b<<endl;
cout<<"char="<<c<<",addr=0x"<<&c<<endl;
cout<<"short="<<s<<",addr=0x"<<&s<<endl;
cout<<"long="<<l<<",addr=0x"<<&l<<endl;
cout<<"int="<<i<<",addr=0x"<<&i<<endl;
cout<<"float="<<f<<",addr=0x"<<&f<<endl;
cout<<"double="<<d<<",addr=0x"<<&d<<endl;
cout<<"unsigned="<<u<<",addr=0x"<<&u<<endl;
cout<<"signed="<<su<<",addr=0x"<<&su<<endl;
}
运行结果:
再次删掉赋值,运行:
发现值还是跟之前的一样。也就是说,VC环境下的release版本的局部变量的值是随机的,也并不是记录上次的内存里的值。