C 数组值因 printf 语句而改变?
C array values change as a result of printf statement?
我正在尝试编写一个程序来打印用户输入的任何数字的偶数。由于某种原因,当用户输入 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]);
}
}
int n, i, leng = 0, arr[leng];
你声明了一个长度为 0 的数组,然后愉快地写到它的末尾。 C 数组不会自行动态增长。因此,您破坏(堆栈)内存,因此您会发现令人惊讶的行为。
更改 leng
的值不会导致数组 arr
神奇地调整大小。 arr
正在创建 - 一次,在定义点 - 作为一个零元素数组(不是特别有用)并且永远不会从那里调整大小。
所有发生的事情是多个值被写入一个元素为零的数组。那是未定义的行为。通常以覆盖与该数组位置相邻的内存的形式....可能包含变量或其他程序数据。
我正在尝试编写一个程序来打印用户输入的任何数字的偶数。由于某种原因,当用户输入 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]);
}
}
int n, i, leng = 0, arr[leng];
你声明了一个长度为 0 的数组,然后愉快地写到它的末尾。 C 数组不会自行动态增长。因此,您破坏(堆栈)内存,因此您会发现令人惊讶的行为。
更改 leng
的值不会导致数组 arr
神奇地调整大小。 arr
正在创建 - 一次,在定义点 - 作为一个零元素数组(不是特别有用)并且永远不会从那里调整大小。
所有发生的事情是多个值被写入一个元素为零的数组。那是未定义的行为。通常以覆盖与该数组位置相邻的内存的形式....可能包含变量或其他程序数据。