为什么自动变量将包含垃圾,如果没有设置?

时间:2014-08-21 15:30:51

标签: c garbage

使用C编程语言'第三版和第32页我看到那些令我困惑的线条:

  

因为自动变量随函数调用而来,所以它们   不要将他们的价值从一次通话保留到下一次,必须是   明确设置每个条目。如果它们没有设置,它们将包含   垃圾

是否说对于以下代码,a在程序执行完毕后不会包含垃圾,如果我这样声明aint a;a会包含垃圾吗?

#include <stdio.h>
int main () {
        int a = 5;
        // int a;
        printf("\n\t %d", a);
}

4 个答案:

答案 0 :(得分:10)

使用未初始化变量的值是未定义的行为。实际上,自动变量分配在处理器寄存器或堆栈中。通常,如果没有初始化,它们将获得当前用于堆栈的寄存器或存储器中的值。所以例如一个int变量可能包含一个内存的一部分,该函数在刚刚调用的函数中是double变量。换句话说,该值是随机的。

答案 1 :(得分:2)

考虑以下示例:

#include <stdio.h>

void fun1(void)
{
    int num1;
    printf("fun1: %i\n", num1);
}

void fun2(void)
{
    int num2 = 7;
    printf("fun2: %i\n", num2);
}

int main(void)
{ 
    fun1();
    fun2();
    fun1();

    return 0;
}

在我的机器上,我得到以下输出:

  

fun1:0
  fun2:7
  fun1:7

正如您所看到的,因为num1未初始化,所以它具有调用时堆栈中任何内容的值。

你可以在程序执行过程中像这样可视化堆栈:

    main     fun1     main     fun2     main     fun1     main
    [0]  SP->[0]      [0]  SP->[7]      [7]  SP->[7]      [7]
SP->[x]      [x]  SP->[x]      [x]  SP->[x]      [x]  SP->[x]

Legend: SP = Stack Pointer, x = Don't Care

答案 2 :(得分:1)

如果你在使用它之前没有初始化变量,那么它就会充满计算机在变量所在的内存空间中所拥有的任何内容,这就是为什么总是给它们这是一个好习惯。初始值,即使它为零。

答案 3 :(得分:0)

  1. 自动变量在堆栈上分配。堆栈经常改变它的大小。推送堆栈不会覆盖内存,只是移动堆栈指针。因此,函数框(保存的寄存器,本地存储和函数的局部变量)被放置在堆栈而不是其他框架上并重叠一些信息。
  2. 静态和全局变量放在数据段或bss段中。出于安全原因,这些段填充了零。想象一下,你没有用零填充这个段。由于计算机不会覆盖内存,因此新程序可以访问在此处分配的先前程序的信息。
  3. 还有寄存器变量,我们要求编译器将它们放在寄存器中。但是不能保证,因为编译器可能决定用自动变量替换它们。