C/C++将整数转换为char指针时输出结果不一致问题求解
问题原因
两次输出结果不一致的核心原因是输出时传入的参数类型不同,cout对不同类型的处理逻辑有区别:
- 第一次打印
data时,传入的是std::string类型对象,cout对该类型有专门的重载实现,会自动遍历输出字符串的全部内容,因此能得到完整的10。 intro是char*类型的指针,你第二次输出时写的是*intro:对char*指针做解引用操作,拿到的是指针指向内存地址的第一个字符元素,等价于intro[0],对应字符串"10"的首字符'1',因此只会输出单个字符1。- 额外问题:你通过
new char[]动态申请了堆内存,代码中没有对应delete[]释放操作,会产生内存泄漏。
修正方案
打印C风格字符串时,直接传入char*指针本身即可,不要对指针解引用;同时记得释放动态申请的堆内存,修正后的完整代码如下:
#include <iostream> #include <sstream> #include <cstring> #include <string> int main(){ char *key1 = "/introduction"; std::ostringstream str1; str1<< 10; std::string data = str1.str(); std::cout << "The data value=" << data << std::endl; // 输出:The data value=10 char *intro = new char[data.length() + 1]; strcpy(intro, data.c_str()); // 直接传入char*指针,cout会自动识别为C风格字符串,输出到'\0'为止 std::cout << "The data value=" << intro << std::endl; // 输出:The data value=10 // 释放动态申请的数组内存,避免内存泄漏 delete[] intro; return 0; }
优化建议
如果不需要修改转换后的字符串内容,完全不需要手动申请内存做拷贝:直接调用
data.c_str()就能拿到std::string内部维护的只读C风格字符串,只要data对象没有被销毁、没有触发内容修改,这个指针就可以正常使用,能省去手动管理堆内存的成本,降低出错概率。
内容的提问来源于stack exchange,提问作者Manu
相关产品推荐
相关产品推荐

