Strlen返回不合理的数字

kak*_*ush 1 c++ strlen

如果我写:

char  lili [3];
cout<<strlen(lili)<<endl;
Run Code Online (Sandbox Code Playgroud)

那么印刷的是:11

但如果我写:

char  lili [3];
lili [3]='\0';
cout<<strlen(lili)<<endl;
Run Code Online (Sandbox Code Playgroud)

然后我得到3.

我不明白为什么它在第一部分返回11?
strlen不应该返回3,因为我分配了3个字符lili

Roo*_*ook 8

这是因为strlen使用"C风格"的空终止字符串.如果你像第一个例子中那样给它一个普通的指针或未初始化的缓冲区,它将继续在内存中行进,直到a)找到a \0,此时它将返回该"string"的长度,或b)直到它到达受保护的内存位置并生成错误.

鉴于你已经标记了这个C++,也许你应该考虑使用std::array或更好的,std::string.两者都提供了长度返回函数(size()),并且都有一些额外的范围检查逻辑,这将有助于防止您的代码在此处进入未初始化的内存区域.


Omn*_*ity 5

strlen函数搜索设置为的字节\0.如果在未初始化的数组上运行它,则行为未定义.