【问题标题】:C++ Vague behavior of uninitialized variable [duplicate]未初始化变量的C ++模糊行为[重复]
【发布时间】:2015-10-26 04:41:42
【问题描述】:

如果我在第一次使用它时取消注释上面的行,下面的代码的行为就像我已将变量 res 初始化为 0。

int t, mi,cur,n,res;

scanf("%d",&t);
while(t-- && scanf("%d",&n) == 1)
{
    for (int i = 1; i <= n; ++i)
    {
        scanf("%d",&h[i]);
    }
    for (int i = 1; i <= n; ++i)
    {
        scanf("%d",&k[i]);
    }

    for (int i = 0; i < 1001; ++i)
        dp[0][i] = INF;
    for (int i = 0; i < 501; ++i)
        dp[i][0] = 0;


    for (int i = 1; i <= n; ++i)
    {
        for (int j = 1; j <= 2*n; ++j)
        {
            dp[i][j] = dp[i-1][j];
            if(j >= k[i-1])
                dp[i][j] = min(dp[i-1][j],1 + dp[i][j-k[i-1]]);
        }
    }
    // The lines below.
    //for (int i = 0; i <= n; ++i)
    //{
    //  for (int j = 0; j <= 2*n; ++j)
    //  {
    //      printf("%d ", dp[i][j]);
    //  }
    //  printf("\n");
    //}

    for (int i = 1; i <= n; ++i)
    {
        res += dp[n][2*h[i]];
    }
    printf("%d\n", res);

当我打印带有注释行的 res 的值时,它给了我垃圾值,但是当我取消注释它时,它给了我预期的值。我不知道语言的高级概念。为什么会这样?

【问题讨论】:

  • 我相信如果你不初始化res 的值会是什么,我相信是无法保证的。所以它可能等于0,或者其他任何东西。在任何情况下都不要依赖它。
  • 您的代码肯定会表现出未定义行为的症状。使用int i = 1; i &lt;= n; ++i 指出使用错误的索引和访问数组越界。请发布Minimal, Complete, and Verifiable example。这将有助于更准确地诊断问题。

标签: c++ output buffer


【解决方案1】:

dp[0][*]dp[*][0] 在您从索引 1 开始填充数组时未初始化。

那么,如果h[i]为0,你肯定会复制一个未初始化的值到res

在这种情况下,advanced concepts of the language 只是未初始化的变量导致未定义的行为,不应使用。请参阅Default variable value(由 Kelvin Lai 评论)。

所以你可以接受这一点,不要试图弄清楚为什么打印值可以解决问题......因为试图确定未定义的行为是如何工作的毫无意义......;-)

注意:您帖子中的注释行修复了该问题,这一事实可能是编译器/平台/配置特定的。这只是一种极端情况,可以解决不应该使用未初始化变量的问题...

【讨论】:

    猜你喜欢
    • 2013-02-22
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-04
    • 1970-01-01
    相关资源
    最近更新 更多