【问题标题】:Index of arrays are exceeding数组的索引超出
【发布时间】:2019-11-18 04:40:08
【问题描述】:

我遇到了数组问题,当我执行以下代码时,它显示的计数最多为 127:

#include<iostream>
using namespace std;
int main()
{
    int x[5];
    int z=0;
    while(1)
    {
        x[z]=z;
        cout<<x[z];
        z++;
    }
}

我的问题

  1. 如果我已经给出了数组“x[5]”的最大索引,那么为什么它在超出限制时不抛出异常。
  2. 如果超出,则在数组的索引 127 'x[127]' 处停止。

我正在使用带有 TDM-GCC 4.9.2 64 位编译器的 dev-c++。

【问题讨论】:

标签: c++ arrays int


【解决方案1】:

因为越界时它不是保证的内存异常,它只是未定义的行为。在您的情况下,它是一个局部变量,因此它将始终如一地遍历堆栈,直到某些未定义的事件崩溃或结束程序。

【讨论】:

  • 但是为什么在 Dev-Cpp 上只有 127。但是,如果我确实使用 CodeBlocks 编写了相同的代码。它显示计数到 73。
  • 当我全局声明索引为 5 的数组时。在 Dev-Cpp 中,它显示计数到 2543 在 codeBlocks 中,它显示计数到 277。
  • 好吧,未定义的行为就是这样,您无法确切知道它会如何破坏事物。在您的情况下,几乎可以肯定都是出于相同的原因。前两个示例是沿着堆栈向上(向下增长)和基于您离堆栈顶部的距离的异常命中。一旦到达堆栈的顶部,它将移动到一个单独的内存页面,这可能是无效内存。
  • 将其定义为全局时,解释相同,但您正在处理流程中的 .data 部分。一旦您通过了内存中图像的其余部分,很可能无法访问下一页。
  • 还要注意你正在处理一个数组,所以索引应该乘以 4 来查看你在内存中移动了多远。您使用全局的示例将是 10,172 字节,这听起来很适合基本的 main 图像。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多