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

递归实现的C语言strlen函数返回值为何是预期值的4倍?

递归实现strlen返回值为预期4倍的原因及修复

问题根源

你的代码核心错误是函数返回类型声明错误:你写的是int *strlen(char *s),返回的是int类型的指针,而非int整数类型。具体影响如下:

  • 当返回0时,对于int*类型来说,这代表空指针(NULL),在32位系统中,空指针的数值为0,且指针类型占用4字节内存。
  • 执行return 1 + strlen(s+1);时,1是int类型,与strlen返回的int*指针进行指针加法运算:指针加法的偏移量是「类型步长 × 数值」,int类型的步长为4字节,所以1 + 指针等价于指针地址增加1×4。每一层递归返回的指针数值都会比正确的长度值大4倍,用int变量接收时就会得到预期值的4倍结果。
  • 改成char返回类型时,返回的是整数类型而非指针,1 + strlen(s+1)变成普通整数加法,结果暂时正确——但这是巧合,char的取值范围有限(通常为-128到127),处理长字符串时会溢出出错。

修复后的代码

将返回类型改为int即可:

int strlen(char *s)
{
    if (*s == '\0')
        return 0;
    else
        return 1 + strlen(s + 1);
}

更贴合标准的写法

标准库的strlen返回类型是size_t(无符号整数类型),能避免负数问题和小类型溢出,建议使用:

#include <stddef.h>

size_t strlen(char *s)
{
    if (*s == '\0')
        return 0;
    else
        return 1 + strlen(s + 1);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 04:50:25