检测到堆栈粉碎:终止中止(核心已转储)

Stack smashing detected : terminated Aborted (core dumped)

我的数组大小为 3x3,这意味着我的索引值仅从 0 到 2。但是当我使用 for 循环遍历时,为什么它在 a[2][0] 的值上选择 a[3][-3] 的值???

当我尝试 [3][3] 时出现的错误是什么?它应该给出垃圾值,所以为什么会出现此错误

*** 检测到堆栈粉碎 ***:已终止

#include <bits/stdc++.h>
#include <iostream>
#define vi vector<int>
using namespace std;

int main()
{
    char a[3][3];
    int pos, row, col;
    cin >> pos;
    memset(a, 48, sizeof(a));
    //row = pos / 3;
    //col = pos % 3 - 1;
    a[3][3] = 'X';
    //a[3][-3] = 'X';
    for (char *b : a)
    {
        for (size_t i = 0; i < 3; i++)
        {
            cout << b[i] << " ";
        }
        cout << endl;
    }
}

对于[3][-3]结果将是 输出:

0 0 0
0 0 0
X 0 0

[3][3] 结果将是 输出:

0 0 0
0 0 0
0 0 0
*** stack smashing detected ***: terminated
Aborted (core dumped)

对于像 a[3][3] 这样的数组,使用 [3][3] 索引到 a,或者 [3][-3] 调用 undefined behavior。任何事情都可能发生,包括打印出垃圾值。该程序甚至不能保证打印一个值,它可能会崩溃。

任一绑定的唯一有效索引是 012

请注意,即使您正确地索引到 aa 读取 也是未定义的行为,因为您还没有初始化 a.你可以这样做:

char a[3][3]{};

现在阅读 a[2][0] 就可以了。

这是因为@Kevin 在评论中回答的算法错误

a[2][0] = 2*3 + 0 = 6 字节

还有

a[3][-3] = 3*3 - 3 = 6字节

所以两者都指向相同的值。