奇怪的数组行为

时间:2011-11-12 05:41:24

标签: c++ arrays

我有这个函数,它采用512个顶点的数组。 (每个包含x,y,z坐标)。无论如何,我犯了一个错误,而不是访问阵列512次,我做了513次。而不是“零”我得到了一个数字。我再次运行它,同样的。我再次增加了迭代次数。即使我超出了数组的限制,每次我的函数都会出现随机值。那些价值观是什么?我是否在操作系统中访问任何内容? (这可能听起来很愚蠢,但对C ++和指针来说是新手)

void print_facet_array(FACET3 *f)
{
    int i=0;
    for (i=0;i<=513;i++)
    {
        printf("The vertices (x,y,z) for facet %d are: V_1 =  x:%f , y:%f, z:%f. \n", i, f[i].p1.x, f[i].p1.y, f[i].p1.z);
        printf("The vertices (x,y,z) for facet %d are: V_2 =  x:%f , y:%f, z:%f. \n", i, f[i].p2.x, f[i].p2.y, f[i].p2.z);
        printf("The vertices (x,y,z) for facet %d are: V_3 =  x:%f , y:%f, z:%f. \n", i, f[i].p3.x, f[i].p3.y, f[i].p3.z);
    }

}

3 个答案:

答案 0 :(得分:4)

实际上,你的循环经历了514次。所以你超过了2。

在C / C ++中覆盖数组是完全未定义的行为。任何事情都可能发生(崩溃,坏数据)。

在你的情况下,你可能正在阅读堆栈或堆垃圾 - 这可能是任何东西。

答案 1 :(得分:4)

访问超出其范围的数组会导致 Undefined Behavior 未定义的行为意味着任何事情都可能发生,所有安全的赌注都会被取消。

所以这些值可以是任何真正的值,它们是存在于某个内存位置的值,这些值不是为您的数组保留的。它们可能属于某个其他有效变量,可能与否。

只需记住从不访问超出其范围的数组元素。

由于你开始学习C ++,这应该是一个很好的阅读:
What every c programmer should know about Undefined Behavior.

答案 2 :(得分:0)

C和C ++不支持数组边界检查。与Java不同,访问其合法边界之外的数组将导致显示异常,C ++允许访问。总之,祝贺;你创造了骰子(一个随机数发生器)。

你到达终点后所看到的值是在最后一个元素之后在内存中发生的任何事情。它可能是一个旧变量,另一个变量,或者只是来自未初始化的内存块的垃圾。