奇怪的内存行为与字符串数组

Cri*_*ian 0 c++ arrays

我是在需要打印控制台窗口内的V @ genere广场参加一个个人项目,但我遇到了一些问题,打印功能,因为它偷偷其他类的记忆,并打印出的字符串从他们的到来.

对于那些不知道什么是Vigenere广场的人来说,这是一张照片

这是我的代码:

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 tmp = (char)(i + 'A') + " |";
        for (int j = 0; j < 26; j++) {
            tmp += " " + (char)(((j + i) % 26) + 'A');
        }
        cipher[i + 1] = tmp;
    }
    for (int i = 0; i < 27; i++) cout << cipher[i] << endl;
}
Run Code Online (Sandbox Code Playgroud)

我的方法是使用for循环逐个创建每个字符串,循环增加行的字母ascii值,另一个为每个颜色移动1的字符串.这是奇怪的输出:

安慰

我单独运行此代码,但它"Invalid Option! Press any key to dismiss." 从我以前用于创建菜单的类中窃取了字符串.我认为这是如何访问保留给该类的部分内存.我究竟做错了什么?

mic*_*srb 5

问题在于这两行:

string tmp = (char)(i + 'A') + " |";

    tmp += " " + (char)(j + i + 'A');
Run Code Online (Sandbox Code Playgroud)

首先评估赋值的右侧,然后才用于构造赋值的结果std::string.字符串文字通常一起存储在程序的某个静态存储器中.在程序中,文字具有指向该存储器的指针的值.单个字符基本上是一个数字.虽然+ plus运算符用于连接事物std::string,但它对指针和数字的行为却不同.如果添加charchar*你的情况,以程序的某些其他字符串-指针(或任何指针),它只是指向指针到一个不同的地方.

要打破它:

  • (char)(i + 'A') + " |"假设i = 0" |"存储在例如0xabcd1234:
  • (char)(0 + 65) + (char*)0xabcd1234
  • (char)65 + (char*)0xabcd1234
  • (char*)0xabcd1275 - oops,我们没有构造一个连接的字符串,我们创建了指向一些随机内存的指针!

您可以通过多种方式编写程序.最小的变化是这样的:

string tmp = (char)(i + 'A') + string(" |");

    tmp += string(" ") + (char)(j + i + 'A');
Run Code Online (Sandbox Code Playgroud)

这意味着 - 确保+运算符的至少一侧实际上是std::string.