如果我写:
char lili [3];
cout<<strlen(lili)<<endl;
然后打印的是:11
但如果我写:
char lili [3];
lili [3]='\0';
cout<<strlen(lili)<<endl;
然后我得到3。
我不明白为什么它在第一部分返回 11?
strlen 不应该返回 3,因为我为 分配了 3 个字符lili
吗?
这是因为strlen
适用于“C 风格”以空字符结尾的字符串。如果您像在第一个示例中那样给它一个普通指针或未初始化的缓冲区,它将继续在内存中前进,直到它 a) 找到 a \0
,此时它将返回该“字符串”的长度,或 b) 直到它到达受保护的内存位置并产生错误。
鉴于您已标记此 C++,也许您应该考虑使用std::array
或更好,std::string
. size()
两者都提供长度返回函数(
该strlen
函数搜索设置为 的字节\0
。如果在未初始化的数组上运行它,则行为未定义。
你必须先初始化你的数组。否则里面有随机数据。
strlen
正在寻找一个字符串终止符号并将计数直到找到它。
strlen 计算字符数,直到达到 '\0'(表示“字符串结尾”)。在 C 和 C++ 中,char[] 等价于 char *,strlenlili
用作指向 char 的指针并迭代它所指向的内存,直到它到达终止的 '\0'。碰巧内存中有 0 个字节,而为您的数组分配的内存中有 11 个字节。你可能会得到更奇怪的结果。
实际上,当您编写 lili[3] = '\0' 时,您会访问数组之外的内存。C/C++ 中 3 元素数组的有效索引为 0-2。