6

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

#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

4 回答 4

11

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

于 2012-10-08T17:23:57.010 回答
4

这是未定义的行为。您仍然只有 10 个合法分配的整数。尽管在这种情况下它似乎有效,但您的程序格式不正确。

于 2012-10-08T17:24:23.423 回答
2

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

于 2012-10-08T17:27:55.253 回答
1

这是运行时错误,而不是编译错误。原因是在 15 处失败而不是 14 处是因为一旦到达位置 15,您就会遇到已分配给另一个指针或应用程序的内存。恰好索引 11、12、13 和 14 是尚未分配的连续内存位置

于 2012-10-08T17:27:58.960 回答