代码之家  ›  专栏  ›  技术社区  ›  user3499524

visualstudio是否允许您访问数组边界之外的内容?(VS2013)[副本]

  •  0
  • user3499524  · 技术社区  · 8 年前

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

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

    然后你做一些类似的事情:

    cout << a[4];
    

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

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

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

    非常感谢。

    1 回复  |  直到 8 年前
        1
  •  2
  •   Some programmer dude    8 年前

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

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

    后跟方括号中的表达式的后缀表达式是后缀表达式。其中一个表达式应具有以下类型 指向的指针 T 另一个应具有非范围枚举或整数类型。结果是类型为的左值 T .类型 T 应为完全定义的对象类型。表达式 E1[E2] (根据定义)与 *((E1)+(E2))

    [强调我的]

    由于上述原因 E1 衰减为指向第一个元素的指针(即,它等价于 &(E1)[0] ),然后编译器使用 (E1)+(E2) 。由于数组已衰减为指针,因此不可能进行边界检查。