代码之家  ›  专栏  ›  技术社区  ›  Robert Deml

变量的默认状态是什么?

  •  4
  • Robert Deml  · 技术社区  · 15 年前

    当一个C程序启动,变量被分配到内存位置时,C标准是否说明该值是否被初始化?

    // global variables
    int a;
    int b = 0;
    static int c;
    

    在上述代码中,“b”将初始化为0。“a”的初始值是多少?“c”是否有任何不同,因为它对该模块是静态的?

    5 回复  |  直到 15 年前
        1
  •  11
  •   j_random_hacker    15 年前

    既然你特别提到 全球的 变量:对于全局变量,是否声明 static 否则,它们将初始化为0。

    局部的 另一方面,变量是 未定义 (除非他们被宣布 静止的 ,在这种情况下,它们也将初始化为0——谢谢泰勒·麦克亨利)。翻译过来,这意味着你不能依赖于它们包含任何特定的东西——它们只包含在那个位置内存中已经存在的任何随机垃圾,这在运行到运行之间可能是不同的。

        2
  •  5
  •   Andrew Hare    15 年前

    编辑: 以下仅适用于局部变量,不适用于全局变量。

    变量的初始值未定义。在一些语言中,变量在内存中的位置在声明时是零的,但是在C(和C++中),一个未初始化的变量将包含当时所在位置的任何垃圾。

    所以最好的方法是,一个未初始化的变量很可能包含垃圾并且有未定义的行为。

        3
  •  4
  •   Community noseratio    7 年前

    a 将为零,并且 c 同样,如果它们是全局的并且没有显式初始化。对于局部静态变量也是如此。

    只有局部非静态变量未初始化。另外,分配给malloc的内存没有初始化。

    here 用于不同对象的初始化规则和C中的分配规则。

        4
  •  1
  •   Telemachus MrJames    15 年前

    今天早上我打字太慢了。当我回答时,三个人很快就进来了,所以我把大部分的帖子都撤了。我发现的链接是清晰和简短的,所以我无论如何都会发布: Wikipedia on "uninitialized variable" 关于基本问题的讨论。

        5
  •  0
  •   Jonas Kölker    15 年前

    快速测试显示a和c为0。

    int a;
    static int c;
    int main() {
        printf("%d %d\n", a, c);
        return 0;
    }
    

    a(和c)的位置在编译时确定;也就是说,它们既不放在堆栈上,也不放在malloc返回的内存间隔中。我认为C标准说在所有情况下,它们都被初始化为0。

    我有99.9%的信心 c 98%的人对 a . 关键词 static 在全局变量的上下文中,实际上类似于 private 在(例如)C++和Java中,它是关于可见性,而不是存储位置。

    对于存储在堆栈或malloc内存中的数据,AndrewHare所说的未初始化变量是正确的。对于静态存储的变量则不是这样。