检测到堆栈粉碎:已终止 中止(核心已转储)
Stack smashing detected : terminated Aborted (core dumped)
我的数组大小为 3x3 意味着我的索引值仅从 0 到 2。 但是当我使用 for 循环遍历时,为什么它会在 a[2][0] 的值上选择 a[3][-3] 的值???
当我尝试 a[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;
}
}
对于 a[3][-3] 结果将是 输出:
0 0 0
0 0 0
X 0 0
对于 a[3][3] 结果将是 输出:
0 0 0
0 0 0
0 0 0
*** stack smashing detected ***: terminated
Aborted (core dumped)
对于像a[3][3]
这样的数组,使用[3][3]
或[3][-3]
索引到a
会调用未定义的行为。任何事情都可能发生,包括打印出垃圾值。该程序甚至不能保证打印值,它可能会崩溃。
任一边界的唯一有效索引是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
字节
所以两者都指向相同的价值。
相关文章:
- 如何找出GDB的SIGTRAP核心转储的根本原因
- C++映射分割错误(核心转储)
- 尽管测试成功,CppUnit测试核心仍被丢弃.为什么
- 在c++中初始化矩阵时出现分段错误(核心转储)
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- MPI突然停止了对多个核心的操作
- 检测到堆栈粉碎:已终止 中止(核心已转储)
- 在基数排序中,我得到 munmap_chunk():无效指针和中止(核心转储).为什么?
- 双重释放或损坏(输出)和中止(核心转储)错误
- OpenCV 在窗口关闭时中止(核心转储)
- 堆栈粉碎中止<unknown>(核心转储)错误
- 在 wc 程序 c++ 中中止(核心转储)
- 从函数返回向量时C++中止(核心转储)
- 带有G 的破坏者con C (中止(核心倾倒))
- "./2"中的错误:free():无效指针:0x000000000096044c *** 已中止(核心转储)
- 在 PQconnectdb C++代码块中中止(核心转储)
- 在c++程序核心转储的反向竞争中,无限中止()
- 在使用 memcpy 填充动态 2d 数组后删除动态 2D 数组时中止(核心转储)
- 在抛出"std::invalid_argument"的实例后终止调用 what(): dataItem 已在树中 中止(核心转储)
- "./a.out"中的错误:双重释放或损坏(!prev):0x096fb008***中止(核心转储)