int main(int argc, char const *argv[])
{
int anArray[5];
anArray[0] = 54;
anArray[1] = 54;
anArray[2] = 54;
anArray[3] = 54;
anArray[4] = 54;
anArray[5] = 54;
anArray[6] = 54;
anArray[7] = 54;
printf ("%i\n", anArray[7]);
return 0;
}
这打印54.
这怎么工作?我们说C数组不是动态的。为什么要编译?或者即使它编译,也应该抛出一个段错误。
我定义了一个包含5个元素的数组,然后我访问了元素5,6,7。为什么可以为一个值分配,例如,anArray [5]?
请注意我有c ++背景,并且我很长时间没有使用过这种数组。
答案 0 :(得分:3)
你正在写下你不拥有的记忆,所以任何事情都可能发生。你很幸运,计算机让你写,然后读取该位置的值。但这只是运气:行为未定义。
请注意,完全相同的事情适用于C ++(因为你提到过),不仅适用于C风格的数组,还适用于C ++ 11中的std :: vector :: operator []和std :: array。在C ++中,您可以使用vec.at(idx)
而不是vec[idx]
来进行边界检查。
答案 1 :(得分:2)
语言本身并没有说运行时或编译器必须检查你是否实际访问了数组边界内的元素。编译器可以发出警告,但就是这样。您有责任访问有效元素。不这样做会导致未定义的行为,这意味着任何事情都可能发生,包括看似工作。
答案 2 :(得分:0)
你基本上是把记忆读到那些你不知道那里有什么的地方。这在C中是一个有用的东西(如果你真的知道你在做什么),但也可以让你花费数小时令人沮丧的调试,因为它是未定义的行为会发生什么。
来自维基百科:
许多编程语言(例如C)从不执行自动边界检查以提高速度。但是,这会导致许多错误和缓冲区溢出未被捕获。许多程序员认为这些语言为了快速执行而牺牲太多。
答案 3 :(得分:0)
没有编译器错误:因为没有与编译器错误相关的问题。
运行时错误:由于未定义的行为,你很幸运,你
的内存位置当时试图访问是免费的!