2014-11-06 110 views
0

我开始学习C++中的数组,并且我似乎无法理解数组在循环超出后继续以及它们返回的值的原因。Array For Loop - Exceeded Value

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

失踪环在体内你的问题。 – Barry 2014-11-06 22:34:41

+2

您正在进入未定义的行为领域。任何事情都没有了,也没有什么可以承诺它可能工作,它可能会崩溃和燃烧。 http://stackoverflow.com/q/367633/477563 – 2014-11-06 22:35:38

+0

好的,我会问你 - 当你犯这个错误时程序应该做什么? – PaulMcKenzie 2014-11-06 22:42:06

回答

-1

我是C#开发人员,但在我看来,你有一个数组具有5个元素,且您尝试打印不存在的元素。 尝试更改您的初始语句为: int array [9] = {0,1,2,3,4,5,6,7,8,9} 并查看是否有效。

+0

这个答案有什么不对的地方,我得到了dinged?有人已经提到该行为未定义(正确)。所以,我只是说如何做才能解决这个问题(而不是复制该回复。)也许我应该停止帮助.... – JustMeToo 2014-11-13 19:13:31

0

因为数组索引语法只是为pointer数学的捷径:

array[i] 

是一样的:

*(array + i) 

在你的情况是数学恰好制定出内存中的地址存在的,可由您的程序寻址,并包含一些随机数据。

访问这些数据被称为buffer overflow错误。

1

您正在打印只有5个数字的数组的第1,3,5,7和9个数字。

在超出第5个数字后,您将打印不属于数组的内存中的未定义值。

为什么循环会继续超出数组的实际长度?因为你告诉它,而C++将允许这样做。

+0

他可以从一个平行宇宙正在打印定义良好的价值观,你都知道。 – 2014-11-06 22:45:19

0

C++中的数组基本上是一个指针和偏移量的句法包装。一个数组变量可以传递给一个相同类型的指针参数。

array[i] 

相同

*(array + i) 

C++不做界对你的阵列检查Java或C#的方式做。原则是C++是语言不会做你没有要求的任何事情。检查您是否正在访问数组越界并抛出异常会增加开销,如果您知道您将访问边界,则这是不必要的。

当你访问应用程序仍然可以访问的内存时,你最终得到的是未初始化的内存。

你可以通过程序得到正确的元素数量的数组中,或相同的代码,你可以使用一个std ::向量和检查大小():

#include <vector> 

std::vector<int> vals = {0, 1, 2, 3, 4}; 
for (int i=0, i < vals.size(), i+=2) 
{ 
    printf("%d ", array [i]); 
}