0
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;
}

输出:数字:127383283 数字:1 数字:2

如果我在每次将变量分配给某个东西之前打印变量,我不应该总是在没有静态关键字的情况下得到垃圾值吗?

4

6 回答 6

6

正在获取垃圾值 - 在这种情况下,这些垃圾值恰好是您在之前调用函数时分配的值。

如果您在调用 之间调用另一个函数testFunc(),或者使用更高的优化设置进行编译,或者使用不同的编译器,您可能会看到完全不同的东西。

于 2012-11-14T04:47:22.393 回答
3

因为它最终每次都为该变量使用相同的内存,而该变量没有改变。

这种行为被认为是未定义的。尽管它可能在您的特定情况下可靠地工作,但并非在所有情况下都可以依赖它。

看在地狱的份上,你为什么不开始接受一些答案呢?

于 2012-11-14T04:47:23.003 回答
2

num没有初始化的值是Indeterminate
它可以是任何东西。你不能依赖它来做任何具体的事情。
请注意,使用此不确定值会导致Undefined Behavior,因此该程序具有 Undefined 行为。

于 2012-11-14T04:47:22.847 回答
1

在 C/C++ 中,不保证自动变量具有任何特定值,除非将它们初始化为所需的值。所以这是设计使然

于 2012-11-14T04:47:52.393 回答
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().

形式上,您看到的行为是未定义的行为,任何事情都可能发生。

于 2012-11-14T04:49:29.597 回答
-1

静态只是意味着它在编译后无法更改。一旦您声明了该值,它将在代码的整个生命周期中保持不变。由于您在函数末尾设置值,因此它可以工作第二次和第三次。

如果将其设置为静态,则无法将值分配给函数中的 is。

于 2012-11-14T04:49:09.113 回答