#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而不是一些垃圾值吗?
答案 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()
,所以如果程序在内存中分配另一个将是浪费的点。这就是变量c
与b
具有相同地址的原因。你看到50(当你打印c
时)的原因是因为你永远不会覆盖该地址中的值。
希望这是有道理的。
答案 2 :(得分:1)
你所拥有的是未定义的行为。该行为可以包括打印正确的值。如果你想知道为什么在这种情况下得到50,请生成一个汇编列表。
使用不同的选项进行编译或使用不同的编译器,您可能会得到不同的答案。