繁体   English   中英

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

[英]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;
    }
}

对于 [3][-3] 结果将是 output:

0 0 0
0 0 0
X 0 0

对于 [3][3] 结果将是 output:

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

对于像a[3][3]这样的数组,使用[3][3][3][-3]a进行索引会调用未定义的行为 任何事情都可能发生,包括打印出垃圾值。 该程序甚至不能保证打印一个值,它可能会简单地崩溃。

任一边界的唯一有效索引是012

请注意,即使您正确索引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个字节

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM