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

为何变量赋值操作会导致strlen返回不同结果?

问题分析与解答

核心原因:无终止符的字符串触发未定义行为

你定义的char sentence[10] = "this is 10";中,字符串字面量"this is 10"恰好占10个字节,数组被完全填满,没有多余空间存放C字符串必需的终止符'\0'。

strlen的工作逻辑是从起始地址遍历字节,直到找到第一个'\0'才停止计数。由于数组本身没有终止符,strlen会越界访问数组后的栈内存,这属于C语言的未定义行为——结果由栈布局、编译器优化等不确定因素决定。

两种场景的行为差异

  1. 保留beg = 0;时返回12
    局部变量在栈上连续存储,sentence数组后紧接着i和beg的内存位置。执行strlen时,这两个变量的初始值非0(未初始化的栈变量值随机),因此strlen遍历到第12个字节才遇到'\0',返回长度12。后续循环中beg = 0;给该位置写入'\0',所以打印时会输出数组的10个字符,再加越界访问到的两个'\0'。

  2. 注释beg = 0;时返回10
    编译器会优化未使用的变量:因为beg未被实际使用,编译器可能不为它分配栈空间,或调整栈布局,使得sentence数组后的第一个字节恰好是'\0',strlen遍历完10个字节后就找到终止符,返回10。

修复方案

要让strlen正常工作,必须保证字符串末尾有'\0':

  • 方案一:扩大数组容量,预留终止符空间,比如char sentence[11] = "this is 10";(10个字符+1个终止符)
  • 方案二:手动在数组末尾添加终止符(会覆盖最后一个字符):sentence[9] = '\0';,适合不需要保留原最后一个字符的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 10:45:32