【问题标题】:Why can I set values outside of the array's range? [duplicate]为什么我可以设置数组范围之外的值? [复制]
【发布时间】:2015-06-03 21:23:52
【问题描述】:

根据我的阅读,数组只能是固定大小,这是在您创建它时定义的(如果您想创建具有动态大小的类似内容,则使用向量代替)。

但是,当我尝试在数组之外设置值时,我完全能够:

int badNums[5] = {4, 13, 14, 24, 34};
badNums[999] = -127;
std::cout << badNums[999] << std::endl;
// Returns -127

如果我尝试访问固定范围之外的数组值,它会变得更加奇怪:

std::cout << badNums[997] << std::endl;
// Returns 825245046 (but seems to be randomly chosen every time I run it)

这是怎么回事?

【问题讨论】:

  • 这里发生了未定义的行为。不多也不少。
  • @TartanLlama 这个问题被关闭为“不是一个真正的问题”,实际上并没有解释发生了什么,或者为什么没有抛出错误。跨度>
  • @AnT “托托,我感觉我们不再使用 Java。”
  • 根据我的阅读,当红灯时我无法过马路,但当我尝试它时,它成功了,我最终走到了街道的另一边。 -- 不能保证你会被阻止这样做,但下一次,你可能会被罚单或被车撞
  • @KeithThompson 我来自这样一个世界,每当你把脚伸到人行道外时,一个无所不知的声音就会从天空回荡:“坚持住,我的儿子;ArrayIndexOutOfBoundsException

标签: c++ arrays c++11


【解决方案1】:

C++ 不执行边界检查,因为那样会减慢速度。它不会阻止您使用数组外部的数组索引(甚至是负数!),但是一旦您使用了未定义的行为。

有时未定义的行为似乎可以正常工作。不过不要上当,幕后可能有你看不到的坏事。对您的示例稍作修改:

int badNums[5] = {4, 13, 14, 24, 34};
int sentinel = 0;
badNums[6] = -127;
std::cout << badNums[6] << sentinel << std::endl;

许多 编译器上,您会看到 sentinel 已将值更改为 -127,但由于这是未定义的行为,因此无法保证。

【讨论】:

    【解决方案2】:

    总之

    您正在读取位于数组后面的内存。只要该内存属于您(r 进程),那“完全没问题”。

    长(呃)答案

    当您创建一个数组时,您会保留一定的内存空间(在您的情况下为 5*sizeof(int)(应该是 ~40byte))。当您尝试访问超出范围的数据(这是您正在做的事情的正确术语)时,一切都可能发生。你很幸运,你正在访问属于你的进程的内存,否则操作系统应该(并且将会)杀死你的进程,你会得到一个 SEGFAULT。

    始终确保您在数组范围内进行读写。其他一切都可能导致不良的运行时行为。

    奖金

    要检查,如果您访问越界,您可以使用 valgrind

    valgrind ./yourProgram
    

    然后 valgrind 将打印每个访问,不应该这样做。

    【讨论】:

      【解决方案3】:

      您正在将内存中的位置设置为该值,但是您没有告诉计算机为您的目的保留该位置。它可能会被不同的进程或您定义的其他变量覆盖。

      正如其他人所说,如果该内存已被保留,例如另一个程序,也可能会出现不可预知的行为。

      【讨论】:

        【解决方案4】:

        badNums[997]*((badNums)+(997)) 相同
        您正在尝试访问一些内容可能是任何内容的内存。
        可能是其他程序使用的旧值,也可能是您的程序使用的值。
        这会导致未定义的行为。

        【讨论】:

          猜你喜欢
          • 2014-09-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-01
          • 1970-01-01
          • 1970-01-01
          • 2014-05-26
          • 2016-01-05
          相关资源
          最近更新 更多