【发布时间】:2015-01-13 15:29:26
【问题描述】:
C++ 中的双端队列有一个奇怪的问题。 假设我有一个大小为 4 的双端队列。出于某种原因,当使用索引运算符时,我似乎能够超过双端队列的大小。 换句话说,如果我编写以下代码,编译器和执行中的程序都不会出错:
for(int i = 0; i < 7; i++)
{
x[i] = (double)(i*i);
cout << x[i] << endl;
}
x 是双端队列。我实际上能够从中获得输出。 它不会增加双端队列的大小。如果我输出 x.size(),我仍然得到 4。 是什么赋予了? 我正在使用 Code::Blocks 和它附带的标准默认 gcc 编译器。
【问题讨论】:
-
越界就是调用未定义的行为,此时您的程序可以执行任何操作,包括擦除硬盘驱动器。
-
普通数组也会发生同样的事情。你为什么感到惊讶?
-
neither the compiler编译器如何知道只有 4 项?nor the program at execution will barf if I write the following我会问你——你所说的“执行会失败”是什么意思?如果你不能回答那个问题,那么你的不回答就是的答案。当你做这样的事情时,没有人知道程序会做什么。这就是你所说的“未定义行为”。 -
通常,当我过去处理过这个问题时,编译器会抱怨,或者程序会在运行时给我一些异常。这也没有。对于大小为 4 的双端队列,从 i = 0 到 6,它返回:x[0] = 0, x[1] = 1, x[2] = 4, x[3] = 9, x[ 4] = 16,x[5] = 25,x[6] = 36。