使用递归打印逆序字符串的C语言代码运行异常原因排查
问题原因分析
你的代码存在4个核心问题,直接导致运行结果不符合预期甚至崩溃:
- 递归调用参数类型错误:
fun(p[i])中p是char*类型,p[i]是单个字符(本质是整数形式的ASCII值),你将其当做内存地址传给要求char*参数的fun,属于非法内存访问,大概率直接触发段错误导致程序崩溃。 - 静态变量逻辑错误:
static int i是静态局部变量,只会在第一次调用fun时初始化一次,整个递归过程中所有层级的fun共享同一个i的值。递归深入时执行i++,等触碰到\0终止条件时i已经等于字符串长度(示例中"rama"的i最终为4,对应p[4]='\0'),而回溯过程中i的值不会自动回退,最终打印的都是空字符,没有有效输出。 - 函数未前置声明:
main函数调用fun前没有声明fun的原型,C语言默认会按照返回值为int、参数任意的规则处理函数调用,属于不规范写法,也容易隐藏参数类型不匹配的问题。 - 返回值缺失:你声明
fun返回int类型,但代码中除了终止条件的空return外没有任何返回值,会触发编译警告。
正确实现方案
不需要使用静态变量,直接通过指针移动实现递归逆序打印更简洁合理,参考代码如下:
#include <stdio.h> // 前置声明函数 void fun(char *p); int main() { char arr[] = "rama"; fun(arr); return 0; } // 无需要返回值,修改为void类型 void fun(char *p) { if(*p == '\0') return; // 先递归处理下一个位置的字符 fun(p + 1); // 回溯时再打印当前字符,自然实现逆序 printf("%c", *p); }
内容的提问来源于stack exchange,提问作者Ravi
相关产品推荐
相关产品推荐

