为什么编译器不会抱怨访问超出动态数组边界的元素?

use*_*593 -1 c++

我正在定义一个大小为9的数组.但是当我访问数组索引10时,它没有给出任何错误.

int main() {
   bool* isSeedPos = new bool[9];
   isSeedPos[10] = true;
}
Run Code Online (Sandbox Code Playgroud)

我期望得到编译器错误,因为isSeedPos[10]我的数组中没有数组元素.

为什么我没有收到错误?

Lou*_*uen 5

这不是一个问题.

C++数组中没有绑定检查.您可以访问超出数组限制的元素(但这通常会导致错误).

如果你想使用一个数组,你必须自己检查你是不是没有界限(你可以将sizee保存在一个单独的变量中,就像你做的那样).

当然,更好的解决方案是使用标准库容器,如std::vector.随std::vector你也可以

  • 使用该myVector.at(i)方法获取第i个元素(如果超出范围将抛出异常)
  • 使用myVector[i]与C风格数组相同的语法,但您必须自己进行边界检查(例如if (i < myVector.size()) ...在访问之前尝试)

另请注意,在您的情况下,std::vector<bool>是一个专门的版本实现,以便每个bool只占用一位内存(因此它使用的内存少于数组bool,可能是你想要的,也可能不是你想要的).