c初学者,矢量

时间:2013-01-31 09:14:31

标签: c vector

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

 #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次?为什么它只在输出的第一行有正确的值?谢谢你:))

5 个答案:

答案 0 :(得分: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])代替硬编码9,则会更安全。

答案 1 :(得分:1)

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

解决方案是仅对vettore[8]进行索引,或将vettore定义为10。

答案 2 :(得分:1)

检查一下:

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

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

答案 3 :(得分:0)

您定义的vettore尺寸为9

int vettore[9];

并且在你的循环中,你从0开始直到9,所以你正在玩数组的10元素而不是9(数组的大小)

您应该定义大小为10

的数组
int vettore[10];

答案 4 :(得分:0)

数组(即“向量”)从索引零开始 NOT 一个;它的内容可能是,例如,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编程书;非常适合开始!!!