检测到堆栈粉碎:终止中止(核心已转储)
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。任何事情都可能发生,包括打印出垃圾值。该程序甚至不能保证打印一个值,它可能会崩溃。
任一绑定的唯一有效索引是 0
、1
和 2
。
请注意,即使您正确地索引到 a
,从 a
读取 也是未定义的行为,因为您还没有初始化 a
.你可以这样做:
char a[3][3]{};
现在阅读 a[2][0]
就可以了。
这是因为@Kevin 在评论中回答的算法错误
a[2][0] = 2*3 + 0 = 6
字节
还有
a[3][-3] = 3*3 - 3 = 6
字节
所以两者都指向相同的值。
我的数组大小为 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。任何事情都可能发生,包括打印出垃圾值。该程序甚至不能保证打印一个值,它可能会崩溃。
任一绑定的唯一有效索引是 0
、1
和 2
。
请注意,即使您正确地索引到 a
,从 a
读取 也是未定义的行为,因为您还没有初始化 a
.你可以这样做:
char a[3][3]{};
现在阅读 a[2][0]
就可以了。
这是因为@Kevin 在评论中回答的算法错误
a[2][0] = 2*3 + 0 = 6
字节
还有
a[3][-3] = 3*3 - 3 = 6
字节
所以两者都指向相同的值。