Strlen 返回不合理的数字



如果我写:

char  lili [3];
cout<<strlen(lili)<<endl;

那么打印的是:11

但如果我写:

char  lili [3];
lili [3]='';
cout<<strlen(lili)<<endl;

然后我得到 3。

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

这是因为strlen适用于"C 样式"以空结尾的字符串。如果你像在第一个示例中那样给它一个普通指针或未初始化的缓冲区,它会继续在内存中行进,直到它 a) 找到一个,此时它将返回该"字符串"的长度,或 b) 直到它到达受保护的内存位置并生成错误。

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

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

您必须先初始化数组。否则,其中有随机数据。

strlen正在寻找字符串终止符号,并将计数直到找到它。

>strlen 计算字符数,直到达到"\0"(表示"字符串结束")。在 C 和 C++ 中,char[] 等价于 char *,strlen 使用 lili 作为指向 char 的指针,并迭代它指向的内存,直到它到达终止的 '\0'。碰巧内存中有 0 个字节,从分配给数组的内存中 11 个字节。你可能会得到更奇怪的结果。

事实上,当你写 lili[3] = '\0'您访问阵列外部的内存。C/C++ 中 3 元素数组的有效索引为 0-2。

相关内容

最新更新