在这个程序中,第一次调用0
时打印p()
(我意识到它可能只是在某些系统上打印垃圾)。
但第二次调用2
时,即使再次声明y
,也会打印y
。似乎保留p()
首次调用void p ()
{
int y;
printf ("%d ", y);
y = 2;
}
void main ()
{
p();
p();
}
时的值。
我很困惑为什么。有人可以解释一下吗?还有我如何修改主要功能,使其不这样做?
{{1}}
答案 0 :(得分:0)
http://en.cppreference.com/w/c/language/storage_duration#Storage_duration
最简单的方法是更改存储持续时间或变量。但另一种方法是使用函数参数和返回值来传递状态信息。静态存储持续时间在多线程程序中可能存在问题,这使得替代解决方案通常更具吸引力。
编辑:对。我阅读并理解与提问完全相反的问题。关于未初始化值的评论是正确答案。这意味着在没有初始化的情况下,变量具有随机值,该值是从一些随机的先前操在这种情况下,随机值恰好与先前调用相同函数的变量相同。答案 1 :(得分:0)
大多数C编译器在堆栈中存储局部变量。你的代码行为如下。
- >第一次打电话给p()
1. **int y;** push y in top of stack. (here value y is 0 or garbage according to compiler because it take value of is memory location).
2. **printf ("%d ", y);** print value of y location.
3. **y = 2;** change value of y location with 2.
4. end of function scope of y finish ( i assume you know a variable scope in c) and pop from stack but not reset value of that location.
- >第二次调用p()
1. **int y;** push y in top of stack (memory location allocated of variable y is same as first call p() memory allocation of y so that here value y is 2 because in first call we set value 2 in this location)
2. **printf ("%d ", y);** print value of y location.
这就是为什么这里2打印第二次调用p()。
供参考,请参阅以下代码,我在此代码中打印变量的值和内存地址。
void p()
{
int y;
printf(“y =%d \ n”的值,y);
printf(“y =%p \ n”的地址,& y);
y = 2;
}
void q() {
int x;
printf(“x的值=%d \ n”,x);
printf(“地址x =%p \ n”,& x);
x = 8;
}
void main()
{
P();
Q();
P();
}