【问题标题】:C variable has a value already? [duplicate]C 变量已经有值了? [复制]
【发布时间】:2016-08-14 01:42:45
【问题描述】:

C 新手,如果这是初级的,请原谅我,但我无法在谷歌上找到一个成功的搜索词。

从一门新语言开始时,我喜欢在 Project Euler 上做一些问题,所以我从问题一开始并遇到了问题。

我的代码...

#include <stdio.h>

int main()
{
    int x;
    int sum;

    for (x = 0; x < 10; x++) {
            if ( x % 3 == 0 || x % 5 == 0 ) {
                    sum = sum + x;
                    printf( "number is %d. sum is %d\n", x, sum );
            }
    }
    printf( "The sum of the multiples of 3 and 5 below 1000 is %d\n", sum );
}

现在当我运行它时,我得到了输出......

number is 0. sum is 32767
number is 3. sum is 32770
number is 5. sum is 32775
number is 6. sum is 32781
number is 9. sum is 32790

uhhhh .....我可以看到它在增加正确性,但是为什么这个数字从 32767 开始呢?它就这样存在于我的记忆中吗?是否有其他程序为此设置了 sum 变量,现在它正在被 this 调用?

如果是这样,那为什么当我运行我的程序两次时它仍然会出现相同的结果?它似乎总是从 32767 开始

我通过将其设置为int sum = 0; 来解决这个问题

但我想了解我的原始代码中发生了什么。

【问题讨论】:

  • 您预计会发生什么?
  • 就像我说我是 C 新手,所以我以前从未处理过这些问题。我知道这与内存有关,而不是设置变量,但我问的是幕后发生了什么
  • 嗯,你应该对你的代码会做什么有某种期望..
  • 我希望它从 0 开始工作。看到结果我可以看到我需要将它设置为 0,我怎么能期望 32797 出来? IDK
  • 顺便说一下,它并不总是 32797。

标签: c


【解决方案1】:

未初始化的变量可以包含任何值(在您的情况下为 32767),甚至可以包含陷阱表示。实际上,尝试访问未初始化的调用会调用未定义的行为,这使得从按预期工作到运行时崩溃的一切都成为可能。

由于sum 预计从0 开始,将其初始化为以下工作:

int sum = 0;

【讨论】:

    【解决方案2】:

    在函数内声明的局部变量不会被运行时初始化。它们被分配在堆栈上并且具有未定义的值(无论发生在该堆栈位置中的什么)。

    在全局范围内定义的变量会自动初始化为 0。

    【讨论】:

      【解决方案3】:

      与其他一些编程语言(如 C# 和 Java)不同,C 不会自动初始化其变量,这意味着您将看到在创建变量时分配给变量的内存位置发生的任何随机数据。

      因此,在使用变量之前,您必须始终将它们设置为某个初始值(对于数值变量通常为零)。

      【讨论】:

      • 这正是我想要的。谢谢
      • 自动存储未初始化,但静态存储已初始化。
      • @teppic:当 OP 更仔细地研究 C 规范时,这一事实应该会变得显而易见。无论如何,养成手动初始化每个变量的习惯是个好习惯。
      • 32767 是最大可能的 16 位有符号整数(所有位都设置为 1,符号位除外)。一些编译器为未初始化的变量设置了标记值,以便您可以清楚地看到它们在调试器中未初始化。
      • 未初始化内存常设置为0xCC in debug mode
      猜你喜欢
      • 2015-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-16
      • 1970-01-01
      • 2012-02-20
      • 2022-01-10
      • 1970-01-01
      相关资源
      最近更新 更多