C语言递归调用中同名局部变量letter为何不会被覆盖?
递归实现句子反转的核心原理
你产生这个疑问的核心是对C语言函数局部变量的存储逻辑不够清楚,下面直接讲核心原因和执行流程:
- 首先明确:你代码里定义的
char letter;是函数内的自动局部变量,这类变量每次函数调用都会单独分配内存:每次调用reverseSentence时,系统都会在进程的调用栈上创建一块独立的、专属本次调用的栈帧,本次调用用到的letter就存在这块独立空间里,不同次调用的letter完全独立,根本不会出现互相覆盖的情况。
只有加了static修饰的静态局部变量,才会存储在全局静态区,所有函数调用共用同一块内存,那种情况才会出现你以为的“新值覆盖旧值”的问题。 - 我们可以用输入
abc\n的场景模拟完整执行流程,就能清晰看到反转逻辑:- 第一次调用
reverseSentence,读取到字符a,不是换行符,触发第二次reverseSentence调用,本次读取的a存在第一层栈帧中暂时搁置 - 第二次调用
reverseSentence,读取到字符b,不是换行符,触发第三次reverseSentence调用,b存储在第二层栈帧中 - 第三次调用
reverseSentence,读取到字符c,不是换行符,触发第四次reverseSentence调用,c存储在第三层栈帧中 - 第四次调用
reverseSentence,读取到换行符\n,不满足if判断条件,直接结束本次调用,返回到第三次调用的位置 - 第三次调用继续执行
reverseSentence()后的语句,打印自身栈帧里存的c,执行完成后返回第二层调用位置 - 第二层调用打印自身栈帧里存的
b,执行完成后返回第一层调用位置 - 第一层调用打印自身栈帧里存的
a,执行完成后返回main函数
最终输出结果就是cba,正好是输入内容的反转。
- 第一次调用
额外拓展:这个代码本质是利用了调用栈“先进后出”的特性,先读取的字符先压入栈底,最后才会被取出打印,自然就实现了反转效果。
内容的提问来源于stack exchange,提问作者I am me
相关产品推荐
相关产品推荐

