我的代码接受一个int输入并将其设置为数组的大小,并且我有一些测试打印件打印出从0到4的数组索引。
std::cout<<array[0]<<std::endl;
std::cout<<array[1]<<std::endl;
std::cout<<array[2]<<std::endl;
std::cout<<array[3]<<std::endl;
std::cout<<array[4]<<std::endl;
但是,我注意到,如果input
小于5,例如说2
,那么前两个cout
会正确打印出来,但其余的会打印出来0
1}}或随机数,如17
和135137
。当你索引超出数组大小或这是我的代码中的问题时,这是一个超出范围的事情吗? (我知道我必须更改打印语句)
通过这种方式动态分配数组,我认为这无关紧要。
答案 0 :(得分:2)
当你索引超出数组大小或者这是我的代码中的问题时,这是否是一个超出范围的事情?
两个
假设array
本身的大小至少为5个元素,则在将值设置为任何值之前,它的初始内容是未定义的;基本上是随机的(他们只是在您的阵列现在占据的特定内存块中发生的事情)。如果array
本身的大小小于5,则值仍未定义,但访问它们也存在崩溃程序的风险。在任何一种情况下,您打算在数组中初始化的有效数据末尾打印值的事实都会导致代码出现问题。
答案 1 :(得分:0)
如果分配n
个元素的数组,则访问(n+1)
元素是未定义的行为(UB)。 (注释后注释:(n+1)
元素是索引为n
的元素。因此,如果array
只有大小为3,则访问array[3]
已导致UB)。
所以,是的,它是一个“越界的东西”,这是你的代码的问题(因为你是访问超出其大小的数组。
为什么不循环打印出现有元素而不是硬编码索引?