越界操作数组,似乎无法理解含义
Manipulating array out of bounds, can't seem to understand implications
#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就是这样。
因此,数组边界简单地定义了您得到定义行为的对象的大小。就是所有。
相关文章:
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 重载操作程序时出错>>用于类中的字符串 memebr
- 控制允许动态运行c++的并发操作数
- 对字符串进行位操作
- 我可以在 C++ 中的函数体之外进行操作吗?
- MPI突然停止了对多个核心的操作
- 为什么C++逐位AND运算符在不同大小的操作数中表现为这样
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 对字符数组中的元素执行逐位操作
- 如何在directx/c++中进行平移/缩放操作
- 逐位操作的隐式类型转换
- 为什么一个向量上的多线程操作很慢
- 排序时无法执行交换操作.我做的时候它会崩溃.为什么
- 位移操作和位掩码未检测到重复字符
- 错误:如果(object1 == object2),“操作器==”无匹配(操作数类型为“ const class”和“
- 当操作数之一是负值C 时,模量操作
- 使用类作为操作数的操作在C++中成为可能
- OpenCV 错误:输入参数的大小不匹配(该操作既不是"数组操作数组")
- 间接操作需要指针操作数
- 错误:需要左键作为赋值的左操作数来执行操作