【问题标题】:Why is this non-static variable retaining its value through function calls?为什么这个非静态变量通过函数调用保留它的值?
【发布时间】:2012-11-14 04:44:43
【问题描述】:
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

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

【问题讨论】:

  • 这是未定义的行为,不要浪费你的时间去推理损坏的代码。

标签: c static keyword


【解决方案1】:

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

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

【讨论】:

  • 好的,谢谢。所以如果我将 num 声明为静态,那么它应该正确保留该值?
【解决方案2】:

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

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

为了见鬼,你为什么不开始接受一些答案呢?

【讨论】:

  • 哈哈,我的错。我选择了一个并给了你一个赞成票。感谢您指出这一点,我没有意识到我一直忘记选择。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      这是一个意外。添加另一个函数:

      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() 中看到一个随机值作为“已保存值”。

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

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

        • 抱歉,这是错误的。 static 关键字与对象的存储类(生命周期)有关。 static 关键字不会阻止您更改对象的值。
        • 您可以随意分配给静态变量。 const,另一方面,你必须初始化并且只能读取。
        • 对不起 - 我完全失去了对那个的想法。是一心多用。谢谢指正。
        猜你喜欢
        • 2021-08-23
        • 2011-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多