递归实现的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
相关产品推荐
相关产品推荐

