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

Manipulating array out of bounds, can't seem to understand implications

本文关键字:操作数 操作 数组 越界      更新时间:2023-10-16
#include <iostream>
int main()
{
int array[5] = {0};
array[6] = 100;
std::cout << array[6];
}

这使输出100这是如何运作的?我们不应该不超出数组的范围吗?即使我摆脱了界限,事情也很好。数组"绑定"实际上是什么意思,它的用途是什么?

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

它是未定义的行为。您可能会撞车,也很幸运没有发生。理想情况下,array[5]在堆栈上分配了内存的5 INT,该程序可以在其空间中访问,但array[6]不在程序内存空间下,可以分配给其他一些程序。实际上,除非您编写不是re-writable的可编程位置,否则您通常仍然不会损坏某些东西。

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

如果您想知道将索引访问到内存的一部分,而不是分配给程序的一部分,请尝试为array[some_random_indexes]分配值。

要在数组的边界之外读取或写入标准的"未定义行为"。编译器不需要检测到它,但有些则是作为警告。允许运行时执行任何操作,包括检测错误,假装没有发生,甚至格式化硬盘。希望它不要!

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

因此,数组边界简单地定义了您得到定义行为的对象的大小。就是所有。