【问题标题】:C array values change as a result of printf statement?C 数组值因 printf 语句而改变?
【发布时间】:2015-04-03 23:06:07
【问题描述】:

我正在尝试编写一个程序来打印用户输入的任何数字的偶数除数。出于某种原因,当用户输入 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]);
    }
}

【问题讨论】:

  • 您将 arr 的长度设置为您设置为 0 的长度。这将中断,您需要将其分配为 n/2 或类似
  • leng = 0, arr[leng];

标签: c arrays printf


【解决方案1】:
int n, i, leng = 0, arr[leng];

您声明一个长度为 0 的数组,然后愉快地写到它的末尾。 C-数组不会自行动态增长。因此,您会破坏(堆栈)内存,从而发现令人惊讶的行为。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-21
      • 2023-03-14
      相关资源
      最近更新 更多