循环数组元素在数组计数器的最后一个值上产生奇怪的值

时间:2016-01-21 20:17:24

标签: c arrays

是的,所以我有这个练习我应该完成:Exercise Specification

我很难确保数组中的数字与计数器匹配。主要问题是在最后一个计数器(49)上似乎有一个数字不在数组中。正如你在这里看到的: Output of current program

我对C编程很新,所以我可以肯定我做错了什么,我只是不确定是什么。另外,我如何添加星星以匹配规格上的彩票阵列。

以下是我的代码的当前状态:

    int main()
{
        //char star;
        int i;
        int lottery[49] = { 23,16,18,19,26,13,22,    /*  1 ..  7 */
                            20,14,22,18,21,15,17,    /*  8 .. 14 */
                            24,15,18,20,13,14,20,    /* 15 .. 21 */
                            18,22,20,16,19,11,20,    /* 22 .. 28 */
                            16,28,22,20,15,17,17,    /* 29 .. 35 */
                            21,21,19,20,14,22,25,    /* 36 .. 42 */
                            19,17,26,18,20,23,12 };  /* 43 .. 49 */                         

        for (i = 0; i <= 49; i++)                   
        printf(" %2d  (%d)  |\n", i, lottery[i]);


    return 0;
}

注意:我已经为星星声明了一个变量,但我不知道如何将它实现到数组中以满足练习的规范。

4 个答案:

答案 0 :(得分:5)

  

表示(i = 0; i <= 49; i ++)

数组访问超出范围。如果有这样的数组:

int lottery[49];

您只能访问索引为[0,48]的元素。否则,这是未定义的行为,所有投注均已关闭。糟糕的是编译器可能不会在这种情况下警告您或报告错误。

更改为:

for (i=0; i<49; i++)

答案 1 :(得分:2)

C数组具有基于0的索引。例如,在您的特定情况下,具有49个元素的数组,您可以拥有索引0到48(包括0和48)的有效访问权限。你应该改变

 for (i = 0; i <= 49; i++)

for (i = 0; i < 49; i++)

否则,您将成为off-by-one,从而访问超出范围的内存。这会调用undefined behavior

尽管如此,int main()应该int main(void)符合标准。

答案 2 :(得分:1)

在C(以及许多其他编程语言)中,数组是0索引的,这意味着它们开始将索引计为0。

这意味着如果您有 N 元素的数组,则最后一个有效索引是 N-1

在您的情况下,您有49个元素,但您的循环条件为i <= 49,这意味着您将尝试从数组中读取索引49。由于这超出了有效范围,因此您可以在内存中读取数组后放置的任何值。

答案 3 :(得分:1)

将您的代码更改为:

for (i = 0; i < 49; i++)
printf(" %2d  (%d)  |\n", i+1, lottery[i]);

这样你只能循环49次(记住数组从0开始),而i+1中的printf会将错误修复一次。