【问题标题】:warning: uninitialized variable //But I have initialized ! C++ Compiler bug?警告:未初始化的变量//但我已经初始化了! C++ 编译器错误?
【发布时间】:2011-07-25 08:52:18
【问题描述】:

我正在尝试编译这个程序,但我收到警告,当我运行 vc++ 2010 调试器时弹出:( 这是我的代码:

#include <iostream>
using namespace std;
int num;
int min(int mas[])
{
    int i,minn,index;        /* But I have declared them : (((( */
    for(i=0;i<num;i++)
        {
            if(mas[i]!=0)minn=mas[i];
            break;
        }
    if(i==num) return 0;
    for(i=0;i<num;i++)
       if(mas[i]!=0 && minn>mas[i])
        {
            minn=mas[i];
            index=i;
        }

    mas[index]=0;
    return minn;
}

int main()
{
    cin>>num;
    int *array=new int[num];  int tmp;
    tmp=min(array);

}

这是一个编译器日志:

prog.cpp: In function ‘int min(int*)’:
prog.cpp:6: warning: ‘index’ may be used uninitialized in this function
prog.cpp:6: warning: ‘minn’ may be used uninitialized in this function

我做错了什么?还是它是编译器错误? :) 谢谢你:)

【问题讨论】:

  • 你需要改进你的代码。 int min(int mas[])这个函数太丑了。

标签: c++ debugging variables warnings initialization


【解决方案1】:

您已声明它们,但没有初始化它们。只需写int minn = 0, index = 0; 即可避免警告。如果你不初始化一个变量,它的默认值就是内存中那个位置的值;通常是垃圾。

问题是,如果num 为负数,那么min() 函数中的任何一个for 循环都不会执行,因此minnindex 将不会被赋值。 if(i == num) 测试也不会脱离功能并防止这种情况发生。所以函数的最后两行将有完全未定义的结果。

不过,有时确实没有用于未初始化变量的路径;有时编译器只是不够聪明,无法弄清楚所有的细微之处。只需给它们一个初始值以避免警告。

【讨论】:

  • 这不是他的问题。为什么编译器抱怨未初始化,即使(据他所说)除非它们已被初始化,否则没有使用它们的路径?
  • 但是有一个路径并不是所有的都被初始化,比如当 num == -1 时。
【解决方案2】:

声明!= 初始化。当您声明它们时,变量具有随机值。只需将它们初始化为合理的值,例如索引 -1 和 INT_MAX 的 minn。

【讨论】:

    【解决方案3】:

    但是你还没有初始化它们:)))) 例如:int i,minn=0,index=0; 假设您传递了等于0num,最后您将返回未初始化的minn 值,而在此之前您将设置mas[unknown_number]=0;,这可能会导致您的应用程序崩溃您将引用最有可能超出您的范围的内存。您应该像if(num&lt;1)return -1;一样在开始时进行检查

    【讨论】:

      【解决方案4】:

      假设你传入的整个数组都是 0。两个循环都短路并且从不执​​行,minn 和 index 都未初始化。

      如果发生这种情况,应该怎么办?将变量设置为完成此操作的值。

      【讨论】:

        【解决方案5】:

        正如你在评论中所说,是的,你已经声明了你的变量,但你还没有初始化它们。初始化一个变量意味着给它一个值。所以在这种情况下,你已经告诉编译器你想要创建三个整数,但是你没有告诉它你想要在这些整数中存储什么值。如果对于通过您的函数的每条可能路径,保证为 index 和 minn 赋予一个值,那将是可以的,但这里的问题是存在一条通过您的函数的路径,其中 minn 和 index 永远不会被初始化。首先,这里:

        for(i=0;i<num;i++)
        {            
            if(mas[i]!=0)minn=mas[i];
            break;        
        }
        

        如果你有一个零数组,那么 minn 永远不会被初始化为一个值。

        然后再往下:

        for(i=0;i<num;i++) 
          if(mas[i]!=0 && minn>mas[i])        
          {
              minn=mas[i];
              index=i;
          }
        

        首先,如果你有一个零数组,那么 minn 的值是多少?没有价值。您要求编译器将 mas[i] 与不存在的数字进行比较。此外,如果 mas[i] 总是等于 0 怎么办?那么现在你不需要初始化 minn 或 index。然而,在函数结束时,您尝试使用 index 的值从数组 amd 中获取一个整数,然后返回 minn(它仍然不等于任何内容)。

        这就是你从编译器得到的问题。它可以看到这种潜在的结果,并警告您,由于这些整数从未获得值,您的函数可能会被破坏。为了解决这个问题,按照其他小伙子的建议做,让 index 和 minn 在开始时等于 0。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-08-29
          • 1970-01-01
          • 2011-01-02
          • 2011-11-29
          • 2012-07-18
          • 2019-05-23
          • 1970-01-01
          相关资源
          最近更新 更多