我开始在C ++中学习数组,我似乎无法理解为什么数组在超出循环后继续以及它们返回的值。
int array[5] = {0, 1, 2, 3, 4}
int i;
i=0;
for (i=0, i < 9, i+=2)
{
printf("%d ", array [i]);
}
为什么数组在4?之后打印出0或随机数的值?
*我知道我正在打印第1,第3,第5,第7和第9个数字
答案 0 :(得分:1)
您打印出只有5个数字的数组的第1,第3,第5,第7和第9个数字。
超过第5个数字后,您将从内存中打印不属于您阵列的未定义值。
为什么循环继续超出数组的实际长度?因为你告诉它,C ++会允许这样做。
答案 1 :(得分:0)
因为数组索引语法只是pointer数学的快捷方式:
array[i]
与:
相同*(array + i)
在你的情况下,数学恰好适用于存在的内存中的地址,可由程序寻址,并包含一些随机数据。
访问此数据称为buffer overflow错误。
答案 2 :(得分:0)
C ++中的数组基本上是指针和偏移量的语法包装。数组变量可以传递给相同类型的指针参数。
array[i]
与
相同*(array + i)
C ++不会像Java或C#那样对数组进行边界检查。原则是C ++是语言没有做你没有要求的任何事情。检查是否正在访问数组越界并抛出异常会增加开销,如果您知道将在边界中访问,则不需要这样做。
当您访问应用程序仍可访问的超出范围的内存时,您最终得到的是未初始化的内存。
您可以以编程方式获取数组中正确数量的元素,或者使用std :: vector的相同代码并检查size():
#include <vector>
std::vector<int> vals = {0, 1, 2, 3, 4};
for (int i=0, i < vals.size(), i+=2)
{
printf("%d ", array [i]);
}
答案 3 :(得分:-1)
我是C#开发人员,但在我看来,你有一个包含5个元素的数组,并且你正在尝试打印不存在的元素。 尝试将您的初始语句更改为: int array [9] = {0,1,2,3,4,5,6,7,8,9} 看看是否有效。