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
相关产品推荐
相关产品推荐

