c++ - 为什么我的(重新)实现 strlen 是错误的?

标签 c++ c string recursion strlen

我想出了这个小代码,但所有专业人士都说它很危险,我不应该写这样的代码。谁能在“更多”细节中强调其漏洞?

int strlen(char *s){ 
    return (*s) ? 1 + strlen(s + 1) : 0; 
}

最佳答案

它本身没有漏洞,这是完全正确的代码。当然,这是过早的悲观。除了最短的字符串,它会耗尽堆栈空间,而且由于递归调用,它的性能会很差,但除此之外没关系。

尾调用优化很可能无法处理此类代码。如果你想过着危险的生活并依赖尾调用优化,你应该改写它以使用尾调用:

// note: size_t is an unsigned integertype

int strlen_impl(const char *s, size_t len) {
    if (*s == 0) return len;
    if (len + 1 < len) return len; // protect from overflows
    return strlen_impl(s+1, len+1);
}        

int strlen(const char *s) {
   return strlen_impl(s, 0);
}

关于c++ - 为什么我的(重新)实现 strlen 是错误的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19235211/

相关文章:

c++ - 模板类专门化,具有成员变量和方法的默认值

c++ - 使用 SCons 跨平台构建 Boost

c++ - 如何获取指向原始数据的 std::set 指针?

c - 如何在网络中广播消息?

c++ - C++ 字符串文字转义字符的规则

c++ - 在字符串中查找精确的子字符串

c++ - 在源代码中表示大数字以提高可读性?

c - 在 c 中使用单个函数调用解析 .conf 文件

c - 访问 strtok 指针时出现段错误

javascript - 这段代码如何知道返回字符串中最长单词的长度?