太一的博客

一个程序学徒

字符串拼接的一个小坑

今天遇到了一个坑,记录一下

1
2
3
string nameSeed = "ABCDE";
string a = "hhh" + nameSeed[0];
cout << a << endl;

我的期望输出是 hhhA,但是输出为空

原因是在C++中,字符串面量(例如"hhh")实际上是字符数组,表现为指向字符的指针

比如,假设"hhh"在内存中表示如下:

1
2
3
4
5
地址	内容
0x100 'h'
0x101 'h'
0x102 'h'
0x103 '\0' // 字符串以空字符 '\0' 结尾

"hhh" 这个字面量实际上是指向地址 0x100 的指针

当做类似 "hhh" + nameSeed[0] 的操作时,实际上C++会把"hhh" 视作一个指针,然后尝试对它进行加法操作。加法操作会对这个指针进行位移。nameSeed[0] 返回的是字符'A',它的ASCII码值是65,意味着指针位移65个字符。这会导致指针指向一个完全不同的内存位置,超出原始字符串的范围。结果是指向了内存中随机的地址,而这个位置通常不包含任何有意义的数据,导致了程序行为异常