在这个简单的3行程序中,c++关于数组的奇怪行为

Weird behavior of C++ in this simple 3 line program, regarding arrays?

本文关键字:数组 于数组 c++ 简单 3行 程序      更新时间:2023-10-16

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

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

它打印出21就可以了。但是看看这个!我把5改成了46,它仍然有效。但是当我输入47时,它没有打印任何东西。没有显示任何错误。这是怎么回事? ?

因为它只是未定义的行为(在c++中没有检查数组的边界)。一切皆有可能。

简单地说,array[5]相当于*(&array[0] + 5),您试图将write/read分配到内存中,而不是分配。

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

当你犯了一个错误,相反发生的是你得到"未定义的行为",这意味着任何事情都可能发生。你可以得到一个崩溃(即操作系统将停止进程,因为它正在做一些讨厌的事情),或者你可以只是破坏内存在你的程序,事情似乎无论如何工作,直到有人需要使用内存。不幸的是,第二种情况是迄今为止最常见的,所以当一个程序在数组外写入时,通常程序只会在随后执行的一百万条指令中崩溃,这是一个完全无害和正确的部分。

C和c++的主要哲学假设是程序员永远不会犯诸如访问索引越界的数组、释放两次相同的指针、在计算过程中产生有符号整数溢出、解引用空指针等错误。

这也是为什么仅仅使用编译器和通过编写代码来尝试学习C/c++是一个糟糕的主意的原因,因为你不会得到这种非常常见的错误的通知。

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

你应该这样做

int array[47];
array[47] = 21;
cout << array[47];