1

为什么这个工作没有任何错误?

int array[2];
array[5] = 21;
cout << array[5];

它打印出 21 就好了。但是看看这个!我将 5 更改为 46,它仍然有效。但是当我输入 47 时,它没有打印任何内容。并且在任何地方都没有显示错误。那是怎么回事!?!?

4

3 回答 3

5

因为它只是未定义的行为(在 C++ 中没有检查数组的边界)。任何事情都有可能发生。

简单地array[5]相当于*(&array[0] + 5),你试图write/read记忆,你没有分配。

于 2013-06-17T08:55:51.987 回答
1

该数组有 2 个元素,但您正在分配array[5] = 21;这意味着 21 在数组外部的内存中。取决于您的系统和环境array[46]是一个有效的内存来保存一个数字,但array[47]不是。

你应该做这个

int array[47];
array[47] = 21;
cout << array[47];
于 2013-06-17T09:02:06.757 回答
1

在 C 和 C++ 语言中,运行时错误很少。

当您犯错时,您会得到“未定义的行为”,这意味着任何事情都可能发生。您可能会崩溃(即操作系统将停止该进程,因为它正在做一些令人讨厌的事情),或者您可能只是破坏程序中的内存并且事情似乎仍然有效,直到有人需要使用该内存。不幸的是,第二种情况是迄今为止最常见的,因此当程序通常在数组外部写入时,程序只会崩溃稍后执行的一百万条指令,这是完全无辜和正确的部分。

C 和 C++ 的主要哲学假设是程序员永远不会犯错误,例如访问具有越界索引的数组、释放两次相同的指针、在计算期间生成有符号整数溢出、取消引用空指针等等.

这也是尝试仅使用编译器并通过编写代码进行实验来学习 C/C++ 是一个糟糕的想法的原因,因为您不会收到这种非常常见的错误的通知。

于 2013-06-17T09:03:31.423 回答