2014-03-07 17 views
0
#include <iostream> 
int main() 
{ 
int array[5] = {0}; 
array[6] = 100; 
std::cout << array[6]; 
} 

这给了输出100 这是如何工作的?难道我们不应该超出阵列吗? 即使我走出界限,这里的工作完全正常。数组“绑定”实际上是什么意思,它有什么用处?操作数组越界,似乎无法理解含义

使用的编译器 - GNU GCC编译器

回答

3

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

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

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

+0

那么,它可以分配给其他一些程序,但不一定。在大多数情况下,这是程序存储器,但是你可以改变其他一些变量的值。 – zoska

1

在标准中定义为“未定义行为”时,读取或写入数组边界之外。编译器不需要检测它,但有些做为警告。运行时可以做任何事情,包括检测错误,假装它没有发生,甚至格式化你的硬盘。希望它不会!

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

所以数组边界只是简单的定义了一个对象的大小,在这个对象中你定义了行为。这就是全部。