visual studio是否允许您访问数组范围之外? (VS2013)

时间:2016-04-25 07:21:50

标签: c++ visual-studio compiler-errors compiler-warnings

我想对visual studio C ++的立场进行正式解释,以及在创建数组时它的作用如下:

int a[3] = {1, 2, 3};

然后你做了类似的事情:

cout << a[4];

经过测试,它将打印出存储在该存储位置的垃圾。为什么它允许程序员这样做,而像javaScript这样的语言会阻止用户这样做?

通过不让编译器在C ++中禁止用户的这种行为,流行的哲学是什么?这是从C继承的吗?

这些只是我的一些小小的好奇心,也许回答的人可以告诉我在哪里可以找到这样的信息。关于正在发生什么的答案不是我要问的,而是我感兴趣的为什么

谢谢。

1 个答案:

答案 0 :(得分:2)

它与编译器无关,但语言是以允许的方式定义的。它将导致未定义的行为,但内容是不确定

至于允许的原因,请考虑下标(数组索引)运算符的定义(来自ISO / IEC 14882:2011(E)§5.2.1/ 1 [expr.sub] ):

  

后缀表达式后跟方括号中的表达式是后缀表达式。其中一个表达式应具有“ 指向T ”的类型,而另一个表达式应具有无范围的枚举或整数类型。结果是类型为“T的左值”。类型“T”应是完全定义的对象类型。表达式E1[E2]*((E1)+(E2))

相同(根据定义)

[强调我的]

由于上述原因,所发生的是数组E1被衰减为指向第一个元素的指针(即它等同于&(E1)[0]),然后编译器执行指针算术{{1 }}。由于数组已经衰减为指针,因此不可能进行边界检查。