操纵数组越界,似乎无法理解其含义

时间:2014-03-07 13:19:24

标签: c++ arrays

#include <iostream>
int main()
{
int array[5] = {0};
array[6] = 100;
std::cout << array[6];
}

这给出了输出100 这是如何运作的?我们不应该不接受数组的界限吗? 即使我走出界限,事情也完美无缺。数组“绑定”实际意味着什么以及它的用途是什么?

编译器使用 - GNU GCC编译器

2 个答案:

答案 0 :(得分:3)

这是未定义的行为。你可能会崩溃,或者你很幸运,它没有发生。理想情况下,array[5]在堆栈上分配5内存,程序可以在其空间中访问,但array[6]不在程序存储空间下,可以分配给其他程序。事实上,除非你正在写一个不是re-writable的可编程位置,否则你通常不会损坏某些东西。

将数据写入您不拥有的某个随机存储器位置不会直接damage系统上运行的任何其他程序,因为每个进程都在其自己的存储空间中运行。

如果您想知道将索引访问未分配给程序的内存部分的未定义行为性质,请尝试将值分配给array[some_random_indexes]

答案 1 :(得分:1)

在数组范围外读取或写入在标准中定义为“未定义行为”。编译器不需要检测它,但有些会作为警告。允许运行时执行任何操作,包括检测错误,假装未发生错误,甚至格式化硬盘。我们希望它不会!

在这种情况下,我们可以猜测分配的存储空间略长于6个整数。为了您的兴趣,我建议您尝试使用索引为7,8,9等的程序,最终会发生一些不好的事情。 C就是这样。

因此,数组边界只是定义了一个对象的大小,在该对象中可以获得定义的行为。这就是全部。