字符串数组内存行为异常,维吉尼亚方阵打印串扰其他类内存
问题分析与修复方案
你的问题根源在于C++中字符串字面量与char类型的错误运算逻辑,这直接导致了非法内存访问,进而读取到了其他类的内存内容。
具体错误点解析
在C++里,像" |"或者" "这样的字符串字面量,本质是const char*类型的指针。当你执行类似(char)(i + 'A') + " |"的操作时,char类型会被隐式转换为int,这就变成了指针偏移运算——相当于把" |"的起始指针往后偏移i + 'A'个字节,而这个位置早已超出了该字符串的内存范围,自然会读取到程序里其他区域的内存(比如你提到的菜单类字符串)。
同样的错误也出现在这一行:
tmp += " " + (char)(((j + i) % 26) + 'A');
" "是指针,加上char转成的int后,同样会偏移到非法内存区域,把随机内容拼接到tmp里。
修复后的代码
要解决这个问题,你需要先把char类型转换成std::string,再和其他字符串进行拼接。可以利用std::string的构造函数string(1, char_value)来生成单个字符的字符串:
static void square() { string cipher[27]; cipher[0] = " | A B C D E F G H I J K L M N O P Q R S T U V W X Y Z"; for (int i = 0; i < 26; i++) { // 先把行首字符转成string,再拼接" |" string tmp = string(1, (char)(i + 'A')) + " |"; for (int j = 0; j < 26; j++) { // 同样把每个列字符转成string,再拼接前面的空格 tmp += " " + string(1, (char)(((j + i) % 26) + 'A')); } cipher[i + 1] = tmp; } for (int i = 0; i < 27; i++) cout << cipher[i] << endl; }
额外说明
这种错误很容易被忽略,因为在很多脚本语言里直接用char + string就能拼接,但C++的类型系统更严谨,字符串字面量是指针而非字符串对象,所以必须显式转换类型才能正确拼接。修复后,你的维吉尼亚方阵应该就能正常打印,不会再读取到其他类的内存内容了。
内容的提问来源于stack exchange,提问作者Cristian
相关产品推荐
相关产品推荐

