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

字符串数组内存行为异常,维吉尼亚方阵打印串扰其他类内存

问题分析与修复方案

你的问题根源在于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:49:19