由于printf语句,C数组值会发生变化吗?

时间:2015-04-03 23:06:08

标签: c arrays printf

我正在尝试编写一个程序,用于打印用户输入的任何数字的偶数除数。出于某种原因,当用户输入10并且程序打印出来时:

 10 is evenly divisible by:
1, 3, 2, 27, logout

我不知道从哪里得到这些数字。如果我取消注释倒数第二个printf语句,我会得到以下结果:

10 is evenly divisible by:
i = 0
1, i = 1
2, i = 2
5, i = 3
32767, logout

为什么要这样做?

这是我的代码:

#include <stdio.h>

int main(void ) {

    int n, i, leng = 0, arr[leng];

    printf("Enter an integer\n");
    scanf("%i",&n);

    printf("%i is evenly divisible by:\n", n);
    for (i = 1; i <= n / 2; i++) {
        if (n % i == 0) {
            arr[leng] = i;
            leng++;
        }
    }


    for (i = 0; i <= leng; i++) {
        printf("i = %i\n", i);
        printf("%i, ", arr[i]);
    }
}

2 个答案:

答案 0 :(得分:2)

int n, i, leng = 0, arr[leng];

你声明一个长度为0的数组,然后快速写出它的结尾。 C-Arrays不会自己动态增长。因此,你腐蚀(堆叠)内存,因此你会发现令人惊讶的行为。

答案 1 :(得分:0)

更改leng的值不会导致数组arr神奇地调整大小。正在创建arr - 一次,在定义点 - 作为零元素的数组(不是特别有用),永远不会从那里调整大小。

所有发生的事情是多个值被写入具有零元素的数组。这是未定义的行为。通常采用覆盖内存的形式,该内存与该数组的位置相邻....可能包含变量或其他程序数据。