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

C语言中两种char数组调用strlen结果为何相差一倍?

C语言中strlen计算数组长度异常的原因及解决办法

核心问题:字符串结束符'\0'的差异

  • 对于char a[] = "Hello";:
    用字符串字面量初始化字符数组时,C编译器会自动在字符序列末尾添加字符串结束符'\0'。数组a的实际内容是{'H','e','l','l','o','\0'},总长度为6。而strlen函数的作用是从起始地址开始计数,直到遇到第一个'\0'为止,因此统计结果是5,符合预期。

  • 对于char b[] = {'H','e','l','l','o'};:
    这种逐个字符手动初始化的方式,编译器不会自动添加'\0'。数组b的长度仅为5,内部没有结束符。strlen找不到结束符时,会越过数组b的内存边界,继续读取后续内存中的内容,直到碰巧遇到某个'\0'才停止。

你看到b的长度总是a的两倍,只是当前程序内存布局下的巧合:数组a刚好紧跟在数组b之后,而a末尾带有'\0'。所以strlen(b)会把b的5个字符和a的5个字符全部统计进去,直到遇到a末尾的'\0',最终结果就是10。如果调整变量顺序或添加其他变量,这个结果会随机变化,甚至可能因非法访问内存导致程序崩溃。

解决方法

  • 手动给数组b添加结束符:
    char b[] = {'H', 'e', 'l', 'l', 'o', '\0'};
    
  • 改用字符串字面量初始化b(和a的方式一致):
    char b[] = "Hello";
    

两种方式都能让strlen(b)正确返回5。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 05:05:24