数组大小不是静态的?

时间:2012-10-08 17:21:26

标签: c++ arrays

有人可以向我解释为什么这样做。我认为数组是静态的,无法扩展,这段代码违背了我以前的知识。

#include <iostream>
using namespace std;
int main(){

    int test[10];
    int e = 14;

for(int i = 0; i < e; i++){
    test[i] = i;
    cout << "  " << test[i];
    }
return 0;
}

此代码输出:   0 1 2 3 4 5 6 7 8 9 10 11 12 13

所以基本上这个程序使用不存在的数组空间。 试图将'e'设置为15,不起作用。

4 个答案:

答案 0 :(得分:11)

数组的大小是固定的,它没有扩展,超出它的界限是未定义的行为。您观察到的是未定义行为(UB)的一种可能结果。你不幸的是,在这种情况下,UB建议的模式与数组扩展一致。

答案 1 :(得分:4)

这是未定义的行为。您仍然只有合法分配的10个整数。虽然它似乎在这种情况下起作用,但你的程序是不正确的。

答案 2 :(得分:2)

你基本上超出了数组分配的内存边界,但C(和C ++)直接编译为机器代码(与虚拟机执行的“托管”代码相反,如Java或.NET),所以程序和操作系统之间没有任何内容可以验证您是否访问了未明确要求的内存。内存是在某些块中分配的,当进程从OS请求内存的某些部分时,它不会获得精确的字节数,但可能会略微增加。在你的情况下,而不是40个字节,你得到56.为什么你没有得到60 - 取决于操作系统内存分配和验证机制。当e被设置为15时,什么是不工作的症状 - 程序崩溃?

答案 3 :(得分:1)

这是运行时错误,而不是编译错误。原因是在15处失败而不是14是因为一旦你到达位置15,你就会击中已经分配给另一个指针或应用程序的内存。事实上,索引11,12,13和14是尚未被malloc'ed的连续内存位置