C++ 对于带有数组的循环 #包括 #包括 使用名称空间std; int main() { int a[5]; 对于(int i=-1;ia+6自动分配ted原语在默认情况下不是初始化的,您应该在编译时在上显示警告;您已经调用了ub,所以…请担心:) int main() { int a[] = {1, 2, 3, 4, 5}; for (int i = 0; i < 5; i++) { cout << i << " " << a[i] << endl; } }

C++ 对于带有数组的循环 #包括 #包括 使用名称空间std; int main() { int a[5]; 对于(int i=-1;ia+6自动分配ted原语在默认情况下不是初始化的,您应该在编译时在上显示警告;您已经调用了ub,所以…请担心:) int main() { int a[] = {1, 2, 3, 4, 5}; for (int i = 0; i < 5; i++) { cout << i << " " << a[i] << endl; } },c++,arrays,loops,for-loop,C++,Arrays,Loops,For Loop,您打印内存中的随机值是因为变量a没有初始化。未初始化的变量在内存中有随机值。您想做什么?首先,正如marcadian指出的,数组a没有初始化,所以数组中的值是完全随机的 另外,a数组的大小是5,这意味着您可以在索引0和4之间(包括0和4)进行访问 但是,在循环中,您尝试在索引-1和索引6处访问。尝试在无效索引(如本例中的-1和6)处写入和读取是未定义的行为(它可能会因分段错误而崩溃,或损坏其他变量,这会使调试过程非常困难……) 避免缓冲区溢出的一种方法是使用std::arraySTL容器,如下所

您打印内存中的随机值是因为变量
a
没有初始化。未初始化的变量在内存中有随机值。您想做什么?

首先,正如marcadian指出的,数组
a
没有初始化,所以数组中的值是完全随机的

另外,
a
数组的大小是5,这意味着您可以在索引0和4之间(包括0和4)进行访问

但是,在循环中,您尝试在索引-1和索引6处访问。尝试在无效索引(如本例中的-1和6)处写入和读取是未定义的行为(它可能会因分段错误而崩溃,或损坏其他变量,这会使调试过程非常困难……)

避免缓冲区溢出的一种方法是使用
std::array
STL容器,如下所示:

#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
  int a[5];
  for (int i = -1; i < 7; i++)
    cout << i << " " << setw(2) << a[i] << endl;

}
std::数组a;
//使用方法“at()”访问元素,它具有绑定检查
a、 在(0);//0是有效的索引
//a、 at(-1);//-1不是有效索引,它将崩溃(至少在调试模式下)
//a、 at(6);//6也不是有效的索引

std::arraySTL容器的作用与普通数组相同,但提供了有用的方法

在计算机中,数组实际上只是给定数量的值,从数组[0]开始,到数组[n]结束。
inta[5];
静态地为堆栈上的5整数分配空间,从[0]开始,到[4]结束。 请尝试此迭代:

std::array<int, 5> a;
//Access elements using the method 'at()', it has bound checking
a.at(0); // 0 is a valid index
//a.at(-1); // -1 is not a valid index, it will crash ( at least in debug mode )
//a.at(6); // 6 is also not a valid index
for(int i=0;i<4;i++)

< /代码> 除了初始化数组A之外,您将访问索引的索引超出了界限。C++使用零索引——例如,可以尝试:

for (int i = 0; i < 4; i++)
int main(){
inta[]={1,2,3,4,5};
对于(int i=0;i<5;i++){

cout看起来不像
a
正在被初始化。
a[-1]
a[5]
a[6]
正在访问
a
越界。这是未定义的行为。这里有两种未定义的行为:访问数组中的无效索引和使用未初始化的值。“不工作”并不奇怪(但没有任何保证)。您好,欢迎使用StackOverflow。请花一些时间阅读帮助页面,特别是名为和的部分。更重要的是,请阅读。您可能还想了解有关的信息。
a
的内存仅从
a
->
a+4
分配,而不是
a-1
->
a+6
自动分配ted原语在默认情况下不是初始化的,您应该在编译时在上显示警告;您已经调用了ub,所以…请担心:)
int main()  {  
    int a[] = {1, 2, 3, 4, 5};  
    for (int i = 0; i < 5; i++) {    
        cout << i << " " << a[i] << endl;  
    }
}