C++输入反转输出问题:使用char*变量ret编译报错求助
解决C++中数字反转后赋值给char*变量的错误问题
嘿,我来帮你看看这个问题~你的代码里有几个关键的错误导致了编译或运行时问题,我一步步给你解释和修正:
首先说说你代码里的核心问题
- 临时字符串指针失效:你用
temp_str.c_str()得到的指针,只在temp_str这个局部字符串对象存在时有效。当代码执行到ret = char_type之后,temp_str很快就会被销毁(出了它的作用域),此时ret指向的是一块已经被释放的内存,后续cout输出时就会触发未定义行为,这也是你看到错误的主要原因之一。 - 函数未完成实际功能:
reserve_num_from_int_to_char函数虽然用new分配了char数组,但根本没把反转后的数字写入进去,直接返回了空数组;之后你又把ret指向了临时指针,导致原来new的内存没人释放,造成内存泄漏。 - 错误的内存释放:最后你
delete[] ret时,ret指向的是temp_str.c_str()返回的指针,这块内存不是用new分配的,delete它会直接触发错误。
修正后的完整代码
#include <iostream> #include <sstream> #include <cstring> using namespace std; char* reserve_num_from_int_to_char(int num) { // 先将数字转换为字符串 stringstream strs; strs << num; string temp_str = strs.str(); // 分配足够内存:字符串长度 + 1(C风格字符串需要末尾的'\0') char* output = new char[temp_str.length() + 1]; // 将字符串内容复制到分配的内存中 strcpy(output, temp_str.c_str()); return output; } int main() { int input, reversednumber = 0, remainder; cout << "input : " << endl; cin >> input; // 保存原始输入(避免循环中修改input后丢失原数据) int original_input = input; // 执行数字反转逻辑 while(input != 0) { remainder = input % 10; reversednumber = reversednumber * 10 + remainder; input /= 10; } // 调用函数获取存储反转数字的char*指针 char* ret = reserve_num_from_int_to_char(reversednumber); cout << "output : " << ret << endl; // 正确释放用new分配的内存,避免泄漏 delete[] ret; return 0; }
关键改动说明
- 完善
reserve_num_from_int_to_char函数:现在这个函数真正实现了将数字转换为动态分配的char*的功能——先通过stringstream把数字转成string,再分配足够的内存(包含字符串结束符'\0'),最后用strcpy把字符串内容复制到分配的内存里,返回的指针指向的是合法且可被释放的内存。 - 避免临时指针失效:现在ret指向的是
new出来的独立内存块,不再依赖临时字符串的生命周期,cout输出时不会访问无效内存。 - 正确管理内存:最后
delete[] ret释放的是之前new分配的数组,符合C++内存管理规则,不会触发错误。 - 补充必要头文件:添加了
<iostream>(cout和cin需要它),并将<string.h>替换为C++标准的<cstring>头文件。
另外补充个小细节:如果输入负数(比如-123),这个代码会正确反转成-321;如果输入0,反转后还是0,都能正常处理。
内容的提问来源于stack exchange,提问作者Rivf
相关产品推荐
相关产品推荐

