我正在玩静态关键字。在下面的代码中,我无法弄清楚为什么x在状态和增量之前保存它。 我原本打算打印1次树。据我所知,如果我将x声明为静态,就应该发生这样的行为。
void print_it(void);
int main (int argc, const char * argv[])
{
print_it();
print_it();
print_it();
exit(EXIT_SUCCESS);
}
void print_it(void)
{
int x;
printf("%d\n", x++);
}
答案 0 :(得分:7)
您尚未将x初始化为任何值。因此,x
中的初始值将是垃圾,并且当它发生时,此垃圾每次都会增加,因为它可能每次都使用相同的内存位置。
尝试将代码更改为:
void print_it(void);
int main (int argc, const char * argv[])
{
print_it();
print_it();
print_it();
exit(EXIT_SUCCESS);
}
void print_it(void)
{
int x = 0;
printf("%d\n", x++);
}
答案 1 :(得分:1)
这是因为函数print_it
的所有3个堆栈占用相同的地址空间。
// before print_it() 1st print_it(); back to main() 2nd print_it(); and so on...
//
// .................. .................. .................. ..................
// ... Stack data ... ... Stack data ... ... Stack data ... ... Stack data ...
// .................. .................. .................. ..................
// <- stack_P |call print_it()| <- stack_P |call print_it()|
// || ||
// \/ \/
// ... some data ... ... some data ... ... some data ...
// | 4 bytes of x | | X still here | | Old X Bytes |
// ... some data ... ... some data ... ... some data ...
// <- stack_P <- stack_P
//
// x got incremented x got incremented again
试试这个主要内容:
int main (int argc, const char * argv[])
{
print_it();
int a;
a += 1;
print_it();
int b;
b += 2
print_it();
exit(EXIT_SUCCESS);
}
答案 2 :(得分:0)
未初始化的局部变量的初始值未定义。在这种情况下,值只是坐在堆栈上并重新使用,因为您连续三次调用相同的函数。如果调用具有局部变量的其他函数,则值将更改,因为其他函数将使用相同的堆栈内存。
答案 3 :(得分:0)
没有人你错了。变量不保持其价值。你没有初始化int x所以每次它有 garbase值&amp;你正在增加那个&amp;打印增加了garbase值。
你变得相同,但标准说它可能不一样。
在一百万次中你仍然得到相同的值,因为无法接受局部变量保持其值。
在不同环境的差异系统上,您的程序可能没有相同的价值..!
编辑: 在大多数情况下,局部变量的值为0.因此它不保留其先前的值。
void print_it(void);
int main (int argc, const char * argv[])
{
print_it();
print_it();
print_it();
return 1;
}
void print_it(void)
{
int x;
printf("starting %d\n", x);
x++;
printf("after increment %d\n", x);
}
如果变量保持其状态,则输出应为
starting 0
after increment 1
starting 1
after increment 2
starting 2
after increment 3
但它的实际输出是
starting 0
after increment 1
starting 0
after increment 1
starting 0
after increment 1
所以现在得到点...... ??
局部变量不保持其状态,但初始化的局部变量始终为0。