首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >循环数组-超出值

循环数组-超出值
EN

Stack Overflow用户
提问于 2014-11-07 06:31:55
回答 4查看 154关注 0票数 0

我开始学习C++中的数组,我似乎不能理解为什么在超过循环之后数组还会继续,以及它们返回的值。

代码语言:javascript
运行
复制
int array[5] = {0, 1, 2, 3, 4}
int i;
i=0;
for (i=0, i < 9, i+=2)
{
    printf("%d ", array [i]);
}

为什么数组输出的值是0或4之后的随机数?

*我知道我打印的是第一,第三,第五,第七和第九个数字

EN

回答 4

Stack Overflow用户

发布于 2014-11-07 06:44:23

您将打印出一个只有5个数字的数组的第1、3、5、7和9个数字。

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

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

票数 1
EN

Stack Overflow用户

发布于 2014-11-07 06:41:33

因为数组索引语法只是pointer数学的快捷方式:

代码语言:javascript
运行
复制
array[i]

与以下内容相同:

代码语言:javascript
运行
复制
*(array + i)

在您的例子中,该数学运算恰好计算出存在于内存中的一个地址,该地址可由您的程序寻址,并且包含一些随机数据。

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

票数 0
EN

Stack Overflow用户

发布于 2014-11-07 06:54:09

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

代码语言:javascript
运行
复制
array[i]

等同于

代码语言:javascript
运行
复制
*(array + i)

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

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

您可以通过编程获得数组中正确的元素数量,或者对于相同的代码,您可以使用std::vector并检查size():

代码语言:javascript
运行
复制
#include <vector>

std::vector<int> vals = {0, 1, 2, 3, 4};
for (int i=0, i < vals.size(), i+=2)
{
    printf("%d ", array [i]);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26790651

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档