void testFunc(int);
int main(int argc, char** argv) {
testFunc(1);
testFunc(2);
testFunc(3);
return (EXIT_SUCCESS);
}
void testFunc(int another)
{
int num;
printf("num: %i\n", num);
num = another;
}
输出: num:127383283 num:1 num:2
如果我在每次分配变量之前打印变量,不应该总是在没有静态关键字的情况下获取垃圾值吗?
答案 0 :(得分:6)
你正在获取垃圾值 - 恰好在这种情况下,这些垃圾值恰好是您在上一次调用函数时分配的值。
如果在调用testFunc()
之间调用另一个函数,或者使用更高的优化设置或使用不同的编译器进行编译,您可能会看到完全不同的东西。
答案 1 :(得分:3)
因为它最终每次都为该变量使用相同的内存,而该变量没有改变。
此行为被视为未定义。虽然它可以在您的特定情况下可靠地工作,但在所有情况下都不能依赖它。
你为什么不开始为了地狱而接受一些答案呢?
答案 2 :(得分:2)
未初始化的num
值不确定
它可以是任何东西。你不能依赖它来具体化。
请注意,使用此不确定值会导致未定义行为,因此该程序具有未定义的行为。
答案 3 :(得分:1)
在C / C ++中,除非将它们初始化为您想要的值,否则不保证您的自动变量具有任何特定值。所以这是设计
答案 4 :(得分:1)
这是一次意外。添加另一个功能:
int use_stack(void)
{
int a[4] = { rand(), rand(), rand(), rand() };
int j = 0;
for (int i = 0; i < 4; i++)
j += a[i];
return j;
}
在前两个testFunc()
来电后拨打电话。您可能会在testFunc()
中看到随机值为“已保存的值”。
正式地,您所看到的行为是未定义的行为,任何事情都可能发生。
答案 5 :(得分:-1)
静态只意味着它在编译后不能改变。一旦声明了值,它将在代码的生命周期内保持不变。由于您在函数末尾设置了值,因此它可以执行第二次和第三次。
如果将其设置为静态,则无法将值分配给函数中的is。