C++ C+中的全局数组+;

C++ C+中的全局数组+;,c++,C++,为什么在全局声明数组时数组没有溢出(例如错误警报),换句话说,为什么我可以用无限量的元素(通过for)填充数组,即使声明中的元素大小有限,但当我在main中本地声明数组时,它会发出警报 char name[9]; int main(){ int i; for( int i=0; i<18; ++i){ cin>>name[i]; } cout<<"Inside the array: "; for(i=

为什么在全局声明数组时数组没有溢出(例如错误警报),换句话说,为什么我可以用无限量的元素(通过for)填充数组,即使声明中的元素大小有限,但当我在main中本地声明数组时,它会发出警报

char name[9];


int main(){


    int i;


    for( int i=0; i<18; ++i){
    cin>>name[i];


    }

    cout<<"Inside the array: ";
    for(i=0; i<20; i++)
    cout<<name[i];

    return 0;

}
字符名[9];
int main(){
int i;
对于(int i=0;i>name[i];
}

coutC++不检查任何类型数组的边界错误。在数组边界之外读取或写入会导致所谓的“未定义行为”,这意味着任何事情都可能发生。在您的情况下,似乎发生的是它似乎正常工作,但程序仍将处于无效状态

如果要进行边界检查,请使用std::vector及其at()成员函数:

vector <int> a( 3 );   // vector of 3 ints
int n = a.at( 0 );     // ok
n = a.at( 42 );        // throws an exception
向量a(3);//3整数的向量 int n=a.at(0);//好的 n=a.at(42);//引发异常
它未定义的行为。任何事情都可能发生。

你不能对变量的内存布局假设太多。它可能在你的计算机上使用这些参数运行,但当你增加访问限制或在另一台计算机上运行该代码时,它会完全失败。因此,如果你真的想编写代码,不要让这成为一种习惯。

C++没有数组边界检查,因此该语言从不检查是否超出了数组的末尾,但正如其他人提到的,可能会发生不好的事情


全局变量存在于与堆栈完全分离的静态段中。它也不包含返回地址之类的重要信息。当您超过数组的边界时,实际上就是在破坏内存。恰好,破坏堆栈比破坏堆栈更可能导致更明显的坏事数据段。所有这一切都取决于操作系统组织进程内存的方式。

我要进一步说明,C/C++没有数组。它们有数组一样的语法糖,可以立即转换为指针算术,而指针算术无法检查,因为指针可以用来访问所有的数据编译器根据索引的静态大小和常量边界执行的任何检查都是一个令人高兴的意外,但你不能依赖它

当我第一次看到它时,有一个奇怪的地方让我震惊:

int a[10], i;
i = 5;
a[i] = 42;  // Looks normal.
5[a] = 37;  // But what's this???
std::cout << "Array element = " << a[i] << std::endl;
inta[10],i;
i=5;
a[i]=42;//看起来很正常。
5[a]=37;//但这是什么???

STD:为什么当它在本地声明时它会发出警报?@持久性,为什么当你在本地声明它时为什么?@持久性你在本地声明数组变量时声明它。尼尔说的对于C/C++中的所有数组都是有效的。考虑使用<代码> STD::vector < /Co> >本地或全局的它是未定义的行为。你可能注意到本地ARR。这就是未定义行为的奇迹——解释可能与程序的内存布局有关,但这并不重要。