最近在看C++ Primer Plus,里面有一段程序:
……
char charr[20];
……
cout<<strlen(charr);
……
书里给的结果是27,我试了一下是31……感觉哪个也解释不清啊……应该是20吧……
嗯,书上也这么说的。可是我分别试过重新运行、重启VC、重启电脑,运行结果都是31……那个不可预料是针对不同编译器说的么?同一编译器不论怎么运行都是一个结果么?
追答这个问题应该是Debug版本的问题,因为在Debug版本的Visual Studio,微软默认开启了缓冲区溢出检查。编译器为分配而没有初始化的内存填0xcc,然后在缓冲区结束的时候又会填入特定的数字。在运行的时候,Debug版本的程序会检查缓冲区后面特定的数字是否被修改掉,如果被修改掉了,就说明你的程序存在数组越界写入的情况,这样让编程的人很快定位到错误。所以,Debug版本因为这些填入的特定的数字,导致出来的结果都相同。
而Release就不同,Release为了提高效率,不会进行任何检查,因此,内存分配之后,就保存着原来的数字,既不会清零也不会写入什么特定的量,因此,你分配内存不初始化里面的内容就和这块内存上次被写入的数据相同,而上次被写入了什么显然是未知的,所以你的程序运行结果也就是未知的。