如果我写:
char lili [3];
cout<<strlen(lili)<<endl;
然后打印的是:11
但如果我写:
char lili [3];
lili [3]='\0';
cout<<strlen(lili)<<endl;
然后我得到3。
我不明白为什么它在第一部分返回11?
strlen不应该返回3,因为我为lili
分配了3个字符?
答案 0 :(得分:8)
这是因为strlen
使用“C风格”的空终止字符串。如果你像第一个例子中那样给它一个普通的指针或未初始化的缓冲区,它将继续在内存中行进,直到a)找到\0
,此时它将返回该“字符串”的长度,或b)直到它到达受保护的存储位置并产生错误。
鉴于您已标记此C ++,您可能应考虑使用std::array
或更好,std::string
。两者都提供了长度返回函数(size()
)并且都有一些额外的范围检查逻辑,这将有助于防止您的代码在这里进行未初始化的内存区域。
答案 1 :(得分:5)
strlen
函数搜索设置为\0
的字节。如果在未初始化的数组上运行它,则行为未定义。
答案 2 :(得分:2)
您必须先初始化阵列。否则就会有随机数据。
strlen
正在寻找一个字符串终止符号,并会一直计算到它找到它。
答案 3 :(得分:2)
strlen计算字符数,直到达到'\ 0'(表示“字符串结束”)。
在C和C ++中,char []等效于char *,strlen使用lili
作为指向char的指针,并迭代它指向的内存,直到它到达终止'\ 0'。恰好在内存中有0个字节来自为阵列分配的内存中的11个字节。你可能会得到更多奇怪的结果。
事实上,当你写lili [3] ='\ 0'时 您访问阵列外的内存。 C / C ++中3元素数组的有效索引是0-2。