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

为何用+运算符初始化std::string的version1会输出乱码?

问题分析:version1初始化乱码的原因

先看version1的核心代码:

std::string version1{ MAJOR_VERSION[0] + "." + MINOR_VERSION[0] };

这段代码的问题出在表达式运算逻辑完全偏离预期:

  • MAJOR_VERSION[0] 是字符 '4',在C++里字符会被当作ASCII整数(值为52)处理;
  • "." 是const char*类型的字符串字面量,本质是指向内存中字符.的指针;
  • 当执行 MAJOR_VERSION[0] + "." 时,实际是把整数52和指针做加法——这是C++里的指针偏移运算,会让指针从.的位置向后跳52个字节,指向一块完全未知的无效内存;
  • 再加上 MINOR_VERSION[0](字符'1',对应整数49),相当于把刚才的无效指针再偏移49个字节,最终得到的是一个指向非法内存区域的const char*;
  • 用这个非法指针初始化std::string时,string会从该位置开始读取字符直到遇到\0,这必然会输出乱码,极端情况下还可能导致程序崩溃。

而version2的写法是完全正确的:

std::string version2{ MAJOR_VERSION[0] };
version2 += ".";
version2 += MINOR_VERSION[0];
  • 第一步用单个字符初始化string,符合std::string的构造规则;
  • 后续的+=操作分别接受const char*(".")和char类型的参数,都是std::string原生支持的合法操作,因此能正确拼接出目标字符串"4.1"。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 16:50:24