1

当我运行程序从大小为 4 的数组中获取第 5 个元素时,我得到的是垃圾值而不是数组越界异常。在 VC++ 运行时,数组的长度不会得到验证吗?

4

4 回答 4

6

在 C++ 中,读取数组的末尾会导致未定义的行为,这意味着几乎任何事情都可能发生 - 你可能会得到垃圾,你可能会得到有效数据,你可能会触发调试断言或异常等。但是,你应该不要依赖任何特别的事情发生。使用 C++ 的挑战之一是学习检查数组索引,因为在 C++ 中,语言不会为你做这件事几乎是生活中的一个事实。

希望这可以帮助!

于 2013-10-07T06:06:39.173 回答
4

普通数组不执行边界检查。如果需要,请改用 a std::vector。它的[]操作符不执行边界检查,但它的at()方法执行,std::out_of_range当访问无效索引时抛出异常。

于 2013-10-07T06:14:17.283 回答
2

VC++ 是一种实现 C 和 C++ 的产品。编程语言没有定义任何边界检查,编译器也没有实现它。当您越界访问内存时,您会访问一些未定义的行为。

于 2013-10-07T06:06:42.743 回答
2

C++ 有带边界检查的数组,但不使用[]. std::array<T, N>::at(i)将检查0 <= i < N,并抛出std::out_of_range异常。

std::vector<T>是一个可变长度的数组等价物,并提供相同的at()方法。这当然使用当前向量长度,而不是硬编码的N.

于 2013-10-07T08:13:11.313 回答