You need to enable JavaScript to run this app. C语言字符串反转程序运行输出(null)的原因是什么?
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 12:24:05