使用C编程语言'第三版和第32页我看到那些令我困惑的线条:
因为自动变量随函数调用而来,所以它们 不要将他们的价值从一次通话保留到下一次,必须是 明确设置每个条目。如果它们没有设置,它们将包含 垃圾
是否说对于以下代码,a
在程序执行完毕后不会包含垃圾,如果我这样声明a
:int a;
则a
会包含垃圾吗?
#include <stdio.h>
int main () {
int a = 5;
// int a;
printf("\n\t %d", a);
}
答案 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)