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

C语言实现位串翻转后返回main函数出现乱码该如何解决?

C语言位串翻转返回乱码问题分析与修复

核心错误点

  • 非法返回栈内存地址:函数内定义的new_S是栈空间的局部变长数组,函数执行结束后该栈空间会被系统回收,返回的指针ptr属于野指针,后续访问该地址属于未定义行为,是乱码的核心成因。你注释中写的malloc堆内存申请思路是正确的,堆内存的生命周期由开发者手动控制,不会随函数退出自动释放。
  • 字符串未补结束符:C语言字符串以'\0'作为结束标识,你定义new_S的长度仅等于输入字符串的长度,既没有预留结束符的存储位置,循环赋值完成后也没有手动追加'\0',printf输出字符串时会持续向后读取内存直到随机遇到'\0',进一步导致乱码输出。
  • 注释中malloc参数错误:原注释里的malloc(strlen(S_string)*sizeof(int))单位错误,字符数组的单位是char不是int,同时需要多申请1个字节存储结束符。

修复后的可运行代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

const char * invert1(char S_string[]) {
    // 堆上申请内存,长度+1预留结束符位置
    char *new_S = malloc((strlen(S_string) + 1) * sizeof(char));
    if (new_S == NULL) {
        return "alloc fail";
    }
    char *ptr = new_S;

    printf("S_string = %s\n", S_string);
    int i = 0;
    int len = strlen(S_string);
    // 提前存储字符串长度,避免循环内重复调用strlen损耗性能
    for(i = 0; i < len; i++) {
        if(S_string[i] == '0'){ // 直接用字符常量比写ASCII码可读性更好
            new_S[i] = '1';
        } else if(S_string[i] == '1'){
            new_S[i] = '0';
        } else {
            free(new_S); // 异常分支提前释放已申请的堆内存,避免泄漏
            return "354";
        }
        printf("1new_S = %s\n", new_S);
        printf("i = %d\n", i);
    }
    new_S[i] = '\0'; // 手动追加字符串结束符
    printf("%s\n", new_S);
    printf("%s", ptr);
    printf("%s", "yeup");
    return ptr;
}

int main(int n, char *k[]){ // 修正main函数标准参数写法
    char S[] = "1";
    const char *res = invert1(S);
    printf("\n翻转结果:%s\n", res);
    // 注意:只有返回的是堆内存时才需要释放,常量字符串不需要释放,加判断避免非法释放
    if (res != "354" && res != "alloc fail") {
        free((void*)res);
    }
    return 0;
}

运行说明

修复后输出符合预期,不会出现乱码,同时处理了内存申请失败、异常分支内存泄漏的边界问题。


内容的提问来源于stack exchange,提问作者WeeWooWeeWoo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 13:21:01