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

不理解C语言自定义strlen函数运行逻辑,求代码逐行解释

问题1:为什么要定义局部变量eos?

  • 传入的参数str存储的是待计算长度的字符串的起始地址,这个值是后续计算长度的基准值。如果直接修改str指针来遍历字符串,后续就无法获取字符串的原始起始位置。定义eos作为临时遍历指针,既可以完成遍历移动,也能保留原始起始地址str用于后续差值计算。

问题2:为什么while循环是空语句?

  • 这段代码中while的判断条件本身已经完成了所有遍历需要的操作:
    1. 先取当前eos指向的字符,判断是否为字符串结束标记'\0'(C语言中'\0'的数值为0,对应布尔值为假)
    2. 无论判断结果是否为真,后置++都会执行,eos指针会向后移动一个char长度的地址
  • 遍历逻辑已经完全在条件判断里实现,不需要额外的循环体逻辑,因此用单独的分号作为空循环体即可,等价于while (*eos++) {},写法更简洁。

问题3:返回表达式eos - str - 1的含义是什么?

  • C语言中两个同类型的指针相减,得到的是两个地址之间相差的对应类型元素的个数,这里都是char*类型,差值就是两个地址之间相差的char字符数量。
  • 循环结束时的指针位置:当eos指向字符串结束符'\0'时,*eos的结果为0,循环条件不成立,但是后置++依然会执行,此时eos会移动到'\0'后面的第一个地址。
  • 此时eos - str得到的是从字符串起始位置到'\0'后一位的总偏移量,比实际字符串长度多了1(多算了最后一次额外的自增步长),所以减1之后就得到了不含结束符的实际字符串长度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 05:36:04