strlen计算字符数组t[0]返回错误值11的原因及解决方法
字符串长度异常问题分析与解决
以下代码执行后,
strlen(t[0])返回结果为11,与预期的5不符:char t[2][5] = {" * "," * "}; printf("%d\n",strlen(t[0]));输出:
11开发者预期每个字符串长度为5(包含两个空格、一个星号和两个空格),请解释该问题的原因,并说明如何正确打印第一个字符串的长度。
问题原因
strlen()的工作逻辑是从起始地址开始计数,直到找到**空字符\0**才停止,它只认这个结束标记。- 你声明的二维数组每个子数组只有5字节空间,但初始化用的
" * "是C语言字符串字面量,这类字面量会自动在末尾追加一个\0作为结束符,也就是说这个字符串实际需要6字节才能存下。 - 因为子数组空间不够,
\0被截断了,导致t[0]没有合法的结束标记。strlen()会越界读取后续内存(包括t[1]的内容),直到碰巧遇到某个\0,最终得到了11这个错误结果——这属于C语言里的未定义行为,越界访问内存的后果是不可预期的。
正确处理方案
有两种可靠的解决方式:
- 扩容数组列长度
把每个子数组的长度设为6,让它能容纳下5个目标字符加末尾的\0:char t[2][6] = {" * "," * "}; printf("%d\n",strlen(t[0])); // 此时返回5,符合预期 - 直接使用数组声明长度
如果你不需要把它当作C风格字符串,只是想获取你设定的字符数量,可以直接利用数组的维度计算:char t[2][5] = {" * "," * "}; printf("%zu\n", sizeof(t[0]) / sizeof(t[0][0])); // 输出5sizeof(t[0])是整个子数组的字节数(5字节),除以单个字符的字节数(1字节),得到的就是你声明的子数组元素个数,也就是预期的长度。
内容的提问来源于stack exchange,提问作者tt0686
相关产品推荐
相关产品推荐

