2016-12-26 143 views
-3

我一直认为如果我访问的数组索引大于数组大小会导致运行时错误?但它似乎很高兴运行并输出零。这个编译器是特定的还是OS特定的?访问数组大小大于数组大小的数组索引时,某些不同的环境是否会导致运行时错误?访问数组索引大于数组大小

例如;

int foo[5]; 
cout << foo[5] << endl; 


vector<int> bar(5); 
cout << bar[5] << endl; 
+6

未定义的行为,它是... –

+0

[未定义的行为链接上SO](http://stackoverflow.com/a/1239977/620908) - 也被称为[鼻恶魔](http://catb.org/行话/ HTML/N /鼻demons.html) –

回答

1

访问它的边界之外的数组它不是C++运行时错误:它是不确定的行为,这意味着任何事情都可能发生,包括什么都没有。

在C++中没有“运行时错误天使”,只有“未定义的行为守护进程”。

1

那么,你提供的代码是未定义行为的典型例子。

我一直认为如果我访问的数组索引大于数组大小,它会导致运行时错误?

载体类.at(size_type pos)方法执行边界校验,并抛出std::out_of_range如果pos不是在容器的范围内。

vector#at documentation

0

这是不确定的行为试图读取或写入超出了数组的边界,如果它是一个动态数组,该程序可能会崩溃。

char c1[] = "123"; 
char c2[2] = "A"; // ok c2[0] = 'A', c2[1] = '\0'; 

cout << c1 << endl; // 123 ok 
cout << c2 << endl; // A ok 

c2[5] = 'M'; // writing to the out bound of the array 

cout << c1 << endl; // 1M3 ??!! 
cout << c2 << endl; // A ok 

它导致内存dongling在这里。