C语言字符串反转程序运行输出(null)的原因是什么?
问题原因
- 核心问题是
reverse函数返回了栈上局部变量的指针:函数内定义的char val[100]是存储在栈区的局部变量,当reverse函数执行完成后,对应的栈帧会被操作系统回收,该内存地址的访问权限失效,后续对该地址的读取属于未定义行为,部分编译器会直接将返回的非法地址处理为NULL,因此输出(null)。 - 冗余操作问题:代码已经在传入的
str数组上完成了字符串反转操作,额外定义val数组做拼接属于完全不必要的操作。 - 变量类型不规范:用于临时存储字符的
temp变量定义为int类型,虽然可以正常运行,但不符合语义规范,应当定义为char类型。 - 性能优化点:循环内反复调用
strlen计算字符串长度,会额外执行多次遍历操作,降低执行效率。
改进方案
最简单的修复方式是直接删除冗余的val数组相关逻辑,反转完成后直接返回传入的原字符串指针即可,修改后的完整代码如下:
#include<stdio.h> #include<string.h> char *reverse(char str[]) { // 提前计算字符串长度,避免循环内反复调用strlen int len = strlen(str); char temp; for(int j=0;j<len/2;j++) { temp = str[j]; str[j] = str[len - j - 1]; str[len - j - 1] = temp; } // 直接返回已经完成反转的原字符串指针 return str; } int main() { char str[20]; printf("Enter a string:\n"); // 限制输入长度避免缓冲区溢出,这里数组长度20,最多输入19个字符 scanf("%19s",str); printf("The Reverse is: \n%s",reverse(str)); return 0; }
如果需要保留原字符串不被修改,可以将reverse函数改为接收调用方传入的结果缓冲区,或者在函数内使用malloc在堆上申请内存存储反转结果(用完后需要主动调用free释放内存,避免内存泄漏)。
内容的提问来源于stack exchange,提问作者csg4786
相关产品推荐
相关产品推荐

