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

C语言递归调用中同名局部变量letter为何不会被覆盖?

递归实现句子反转的核心原理

你产生这个疑问的核心是对C语言函数局部变量的存储逻辑不够清楚,下面直接讲核心原因和执行流程:

  • 首先明确:你代码里定义的char letter;是函数内的自动局部变量,这类变量每次函数调用都会单独分配内存:每次调用reverseSentence时,系统都会在进程的调用栈上创建一块独立的、专属本次调用的栈帧,本次调用用到的letter就存在这块独立空间里,不同次调用的letter完全独立,根本不会出现互相覆盖的情况。
    只有加了static修饰的静态局部变量,才会存储在全局静态区,所有函数调用共用同一块内存,那种情况才会出现你以为的“新值覆盖旧值”的问题。
  • 我们可以用输入abc\n的场景模拟完整执行流程,就能清晰看到反转逻辑:
    1. 第一次调用reverseSentence,读取到字符a,不是换行符,触发第二次reverseSentence调用,本次读取的a存在第一层栈帧中暂时搁置
    2. 第二次调用reverseSentence,读取到字符b,不是换行符,触发第三次reverseSentence调用,b存储在第二层栈帧中
    3. 第三次调用reverseSentence,读取到字符c,不是换行符,触发第四次reverseSentence调用,c存储在第三层栈帧中
    4. 第四次调用reverseSentence,读取到换行符\n,不满足if判断条件,直接结束本次调用,返回到第三次调用的位置
    5. 第三次调用继续执行reverseSentence()后的语句,打印自身栈帧里存的c,执行完成后返回第二层调用位置
    6. 第二层调用打印自身栈帧里存的b,执行完成后返回第一层调用位置
    7. 第一层调用打印自身栈帧里存的a,执行完成后返回main函数
      最终输出结果就是cba,正好是输入内容的反转。

额外拓展:这个代码本质是利用了调用栈“先进后出”的特性,先读取的字符先压入栈底,最后才会被取出打印,自然就实现了反转效果。

内容的提问来源于stack exchange,提问作者I am me

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 08:45:03