1

我是交流初学者,我有一个问题(像往常一样)。我写了这个简单的程序:

 #include <stdio.h>
 #define SIZE 10

 main()
 {
    int vettore[9];
    int contatore1,contatore2;

    for(contatore1 = 0; contatore1 <= 9; ++contatore1)
    {
        vettore[contatore1] = contatore1*2;
    }

    printf("%d\n\n", vettore[9]);

    for(contatore2 = 0; contatore2 < 10; ++contatore2)
    {
        printf("%d\n", vettore[contatore2]);
    }

    printf("\n%d\n", vettore[9]);

    return 0;
}

这个程序的输出是:

18

0
2
4
6
8
10
12
14
16
9

10

为什么 vettore[9] 的值变化了 3 次?为什么它只在输出的第一行有正确的值?谢谢你 :)

4

5 回答 5

5

C 数组从零开始,因此 9 元素数组的有效索引为 [0..8]。您正在写超出数组的末尾。这有未定义的结果,但可能会破坏下一个堆栈变量。

更详细地说... vettore有 9 个元素,可以使用vettore[0]...访问vettore[8]。第一个循环的最后一次迭代写入vettore[9]. 这会访问超出数组末尾的内存。这会导致未定义的行为(即 C 标准未在此处指定预期结果),但很可能 的地址与vettore[9]的地址相同contatore2,这意味着写入后一个变量。

您在下一个循环中遇到了类似的问题,它打印的元素多于vettore包含的元素。

您可以通过将循环更改为来解决此问题

for(contatore1 = 0; contatore1 < 9; ++contatore1)
for(contatore2 = 0; contatore2 < 9; ++contatore2)

请注意,如果您改为计算数组的大小,通过sizeof(vettore)/sizeof(vettore[0])在循环的退出测试中使用代替 hard-coding会更安全9

于 2013-01-31T09:16:27.130 回答
1

您的数组vettore有 9 个元素,但通过引用vettore[9],您实际上是在引用第10 个元素(因为元素索引从 0 开始)。所以它是堆栈上的某个随机位置,没有明确定义的值。

解决方案是仅索引到vettore[8],或定义vettore为大小为 10。

于 2013-01-31T09:19:22.570 回答
1

看一下这个:

for(contatore2 = 0; contatore2 < 10; ++contatore2)
{
    printf("%d\n", vettore[contatore2]);
}

您正在显示 vettore 数组的 11 个元素(定义为 9 个整数数组)。我认为错误在于堆栈上的随机分配

于 2017-01-27T21:49:55.440 回答
0

您定义的vettore尺寸是9

int vettore[9];

在你的循环中,你从0until开始,9所以你正在使用10数组的元素而不是9(数组的大小)

你应该用大小定义数组10

int vettore[10];
于 2013-01-31T09:18:17.047 回答
0

数组(即“向量”)从索引 0 NOT one开始;例如,它的内容可能是 5,但它会占用索引位置 0,1,2,3,4....

[1][2][3][4][5]   <- Five items
 0  1  2  3  4    <- Their respective locations in the array

可视化字符串中的字符也是如此.....(从技术上讲,内存中的位置包含 ASCII 值——为了好玩,请查看它;))

['c']['a']['t']   <- Three items
  0    1    2     <- Their index location in the array

我建议 Kochan 的 C Programming 书;非常适合开始!!!

于 2017-08-31T19:43:26.977 回答