为什么这个工作没有任何错误?
int array[2];
array[5] = 21;
cout << array[5];
它打印出 21 就好了。但是看看这个!我将 5 更改为 46,它仍然有效。但是当我输入 47 时,它没有打印任何内容。并且在任何地方都没有显示错误。那是怎么回事!?!?
因为它只是未定义的行为(在 C++ 中没有检查数组的边界)。任何事情都有可能发生。
简单地array[5]
相当于*(&array[0] + 5)
,你试图write/read
记忆,你没有分配。
该数组有 2 个元素,但您正在分配array[5] = 21;
这意味着 21 在数组外部的内存中。取决于您的系统和环境array[46]
是一个有效的内存来保存一个数字,但array[47]
不是。
你应该做这个
int array[47];
array[47] = 21;
cout << array[47];
在 C 和 C++ 语言中,运行时错误很少。
当您犯错时,您会得到“未定义的行为”,这意味着任何事情都可能发生。您可能会崩溃(即操作系统将停止该进程,因为它正在做一些令人讨厌的事情),或者您可能只是破坏程序中的内存并且事情似乎仍然有效,直到有人需要使用该内存。不幸的是,第二种情况是迄今为止最常见的,因此当程序通常在数组外部写入时,程序只会崩溃稍后执行的一百万条指令,这是完全无辜和正确的部分。
C 和 C++ 的主要哲学假设是程序员永远不会犯错误,例如访问具有越界索引的数组、释放两次相同的指针、在计算期间生成有符号整数溢出、取消引用空指针等等.
这也是尝试仅使用编译器并通过编写代码进行实验来学习 C/C++ 是一个糟糕的想法的原因,因为您不会收到这种非常常见的错误的通知。