当我运行程序从数组中获得第5个元素时,只有大小为4,我得到垃圾值而不是数组超出绑定异常。在VC ++运行时不能验证数组的长度吗?
答案 0 :(得分:6)
在C ++中,读取数组的末尾会导致未定义的行为,这意味着几乎任何事情都可能发生 - 您可能会遇到垃圾,可能会获得有效数据,您可能会触发调试断言或例外等。但是,你不应该依赖任何特别的事情。使用C ++的一个挑战是学习检查你的数组索引,因为它几乎是C ++生活中的一个事实,语言不会为你做。
希望这有帮助!
答案 1 :(得分:4)
普通数组不执行边界检查。如果您需要,请改用std::vector
。它的[]
运算符不执行边界检查,但是它的at()
方法会执行,在访问无效索引时抛出std::out_of_range
异常。
答案 2 :(得分:2)
VC ++是一种实现C和C ++的产品。编程语言没有定义任何边界检查,编译器也没有实现它。当您从边界访问内存时,您可以访问某些未定义的行为。
答案 3 :(得分:2)
C ++包含绑定检查的数组,但不使用[]
。 std::array<T, N>::at(i)
将检查0 <= i < N
,并抛出std::out_of_range
例外。
std::vector<T>
是数组的可变长度等价物,并提供相同的at()
方法。这当然使用当前的向量长度,而不是硬编码的N
。