为什么未初始化的变量不能打印垃圾值?

时间:2017-11-04 07:16:31

标签: c

#include <stdio.h>
void foo(void)
{
    int c;
    printf("%d\n", c);
}
void bar(void)
{
    int b = 50;
}
int main(void)
{
    bar();
    foo();
}

输出:50 有人可以解释为什么foo()打印50而不是一些垃圾值吗?

3 个答案:

答案 0 :(得分:4)

我的GCC编译器生成了以下警告。

In function ‘bar’:
source_file.c:9:9: warning: unused variable ‘b’ [-Wunused-variable]
     int b = 50;
         ^
source_file.c: In function ‘foo’:
source_file.c:5:5: warning: ‘c’ is used uninitialized in this function [-Wuninitialized]
     printf("%d\n", c);

它的打印垃圾价值。如果在C中使用未初始化的变量,则调用未定义的行为。

C11 6.3.2.1(p2):

  

[...]如果左值指定一个自动存储持续时间的对象   可以用寄存器存储类声明(永远不会   得到了它的地址),并且该对象未初始化(未声明   使用初始化程序并且之前未执行任何赋值   使用),行为未定义。

答案 1 :(得分:2)

这是因为您没有初始化c变量。

如果你尝试运行它:

#include <stdio.h>
void foo(void)
{
   int c;
   printf("%p\n", &c);
   printf("%d\n", c);
}
void bar(void)
{
   int b = 50;
   printf("%p\n", &b);
}
int main(void)
{
   bar();
   foo();
}

您会看到变量的地址是相同的。这就是为什么当你打印c时它显示为50.

变量c使用与b相同的地址的原因是因为无需保留b的值,因为永远无法访问b foo(),所以如果程序在内存中分配另一个将是浪费的点。这就是变量cb具有相同地址的原因。你看到50(当你打印c时)的原因是因为你永远不会覆盖该地址中的值。

希望这是有道理的。

答案 2 :(得分:1)

你所拥有的是未定义的行为。该行为可以包括打印正确的值。如果你想知道为什么在这种情况下得到50,请生成一个汇编列表。

使用不同的选项进行编译或使用不同的编译器,您可能会得到不同的答案。

相关问题