C++ 数组的大小是否在c++;

C++ 数组的大小是否在c++;,c++,C++,我了解到数组的大小有一些常量值。比如, int array[5]; //This array have only 5 index that can be usable 这就是我学到的 但是当我尝试这个代码时,它与这个假设不一致 #include <iostream> using namespace std; int main() { int array[4]; array[5]=6; cout<<array[5]<<endl

我了解到数组的大小有一些常量值。比如,

int array[5]; //This array have only 5 index that can be usable
这就是我学到的

但是当我尝试这个代码时,它与这个假设不一致

#include <iostream>
using namespace std;

int main()
{
    int array[4];   
    array[5]=6; 
    cout<<array[5]<<endl;   
    return 0;
}
#包括
使用名称空间std;
int main()
{
int数组[4];
数组[5]=6;

答案是不确定的行为

C++不会对绑定进行运行时检查。因此,在您的情况下,它可以工作,但不使用数组空间。 在其他情况下,您将得到一个例外。
此外,在其他情况下,您可以使用数组[10],但您使用的是操作系统提供给程序的其他空间。

它可以工作,因为到达数组末尾变量后存在内存。问题是它没有为该数组保留。这意味着数组[5]将指向一个内存磁贴,但您无法确定从中可以得到什么。它可能是另一个变量,也可能是另一个程序保留的。如果您设法编辑它(就像您所做的那样),当其他变量或程序保留此内存位置时,问题将出现。然后您的数组[5]将不再保留值6,但它将更改(甚至可能无法从您的工作代码中访问它)。

数组的大小是恒定的

您创建了一个4元素数组:

  • 第一个元素是
    数组[0]
  • 第二个是
    数组[1]
  • 第三个是
    数组[2]

C++是一种不安全的语言。如果您执行类似于
array[5]
甚至
array[-1],你将访问一堆随机数据,这叫做不确定行为。C++在调用未定义行为时可以自由地做任何它想做的事情;你的程序在这里运行得很好,但是在别人的计算机上崩溃。编译器不会检查以确保任何索引都是有效的。这与任何事情无关。数组大小是否为常量。

声明一个类似int-ar[n]的数组允许您使用从0到n-1的索引。访问任何超出此范围的索引都会给您带来意外的行为。

int-array[4]
定义一个由4个整数组成的数组,您可以使用索引0到3,
array[5]访问它们
超出限制,会导致未定义的行为。您在数组结束后将数据写入内存地址。它可能看起来工作正常,但很可能导致崩溃,或覆盖内存中的其他数据。“此代码工作正常”是的,有时不明确的行为是有效的。这就是为什么它是如此阴险。早期的StAcExpRoad引用允许更好地使用C++ 11代码>数组ARR;< /COD>,而不是< > > >(x)< /C>……C++(和C)只是“不安全的”。对于那些不知道自己在做什么的人来说。例如,如果你知道如何使用电锯,电锯是非常安全的,我不会再回去用手锯干大活儿了,因为这太像艰苦的工作了:-)