C++中字符数组长度问题

最近在看C++ Primer Plus,里面有一段程序:
……
char charr[20];
……
cout<<strlen(charr);
……
书里给的结果是27,我试了一下是31……感觉哪个也解释不清啊……应该是20吧……

你这个代码的结果是未定的,不可预料的,因为你定义了数组却没有初始化,编译器并不会自动为新的变量初始化为0,而strlen是一直算到一个'\0'为止的长度,而你的数组里面根本没有元素是等于0的,因此strlen中已经出现了数组越界了,他一直读到第31个字节的地方才读到一个0,所以返回了31.追问

嗯,书上也这么说的。可是我分别试过重新运行、重启VC、重启电脑,运行结果都是31……那个不可预料是针对不同编译器说的么?同一编译器不论怎么运行都是一个结果么?

追答

这个问题应该是Debug版本的问题,因为在Debug版本的Visual Studio,微软默认开启了缓冲区溢出检查。编译器为分配而没有初始化的内存填0xcc,然后在缓冲区结束的时候又会填入特定的数字。在运行的时候,Debug版本的程序会检查缓冲区后面特定的数字是否被修改掉,如果被修改掉了,就说明你的程序存在数组越界写入的情况,这样让编程的人很快定位到错误。所以,Debug版本因为这些填入的特定的数字,导致出来的结果都相同。

而Release就不同,Release为了提高效率,不会进行任何检查,因此,内存分配之后,就保存着原来的数字,既不会清零也不会写入什么特定的量,因此,你分配内存不初始化里面的内容就和这块内存上次被写入的数据相同,而上次被写入了什么显然是未知的,所以你的程序运行结果也就是未知的。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-07-09
如果你要看到输出20,应该这么写
cout << sizeof(charr)/sizeof(charr[0]);

strlen是求字符串长度的,也就是strlen(charr)的话,就是从charr[0], charr[1], ...一直到遇到一个0为止的字符个数。你没有初始化,这个结果是未定的,可能是0,也可能是上千万。

sizeof是求变量(或数组)大小的。至于为什么要除以sizeof(charr[0]),这是个编程习惯,使得你在charr是int数组时也能得到20。
第2个回答  2011-07-09
要输入必须有内存,怎么可能不先定义呢.. 你可以开个足够大的字符数组, 读完以后用strlen查看长度再动态申请一个长度 1的数组, 然后用strcpy复制过去
第3个回答  2011-07-09
由于charr[20]未初始化,所以结果是未知的。
相似回答