You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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语言里的未定义行为,越界访问内存的后果是不可预期的。

正确处理方案

有两种可靠的解决方式:

  1. 扩容数组列长度
    把每个子数组的长度设为6,让它能容纳下5个目标字符加末尾的\0:
    char t[2][6] = {"  *  ","  *  "};
    printf("%d\n",strlen(t[0])); // 此时返回5,符合预期
    
  2. 直接使用数组声明长度
    如果你不需要把它当作C风格字符串,只是想获取你设定的字符数量,可以直接利用数组的维度计算:
    char t[2][5] = {"  *  ","  *  "};
    printf("%zu\n", sizeof(t[0]) / sizeof(t[0][0])); // 输出5
    
    sizeof(t[0])是整个子数组的字节数(5字节),除以单个字符的字节数(1字节),得到的就是你声明的子数组元素个数,也就是预期的长度。

内容的提问来源于stack exchange,提问作者tt0686

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 21:35:27