为何用+运算符初始化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
相关产品推荐
相关产品推荐

