为什么这个非静态变量通过函数调用保留其值?

时间:2012-11-14 04:44:44

标签: c static keyword

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

如果我在每次分配变量之前打印变量,不应该总是在没有静态关键字的情况下获取垃圾值吗?

6 个答案:

答案 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。