繁体   English   中英

警告:未初始化的变量//但我已经初始化了! C ++编译器错误?

[英]warning: uninitialized variable //But I have initialized ! C++ Compiler bug?

我试图编译这个程序,但我收到警告,当我运行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 minn = 0, index = 0; 避免警告。 如果不初始化变量,则其默认值为内存中该位置的任何值; 通常是垃圾。

问题是,如果num为负数,则min()函数中的for循环都不会执行,因此minnindex将不会被赋值。 if(i == num)测试也不会突破该功能并防止这种情况发生。 因此该函数的最后两行将具有完全未定义的结果。

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

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

但你还没有初始化它们int i,minn=0,index=0; )))EX: int i,minn=0,index=0; 想象一下,你传递的num等于0 ,最后你将返回未初始化的minn值,在此之前你将设置mas[unknown_number]=0; 这可能会导致您的应用程序崩溃,因为您将引用最有可能超出范围的内存。 你应该在if(num<1)return -1;的前缀中进行检查if(num<1)return -1;

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

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

正如您在评论中所说,是的,您已声明了您的变量,但尚未初始化它们。 初始化变量意味着给它一个值。 所以在这种情况下,你告诉编译器你要创建三个整数,但是你没有告诉它你要在那些整数中存储什么值。 如果,对于通过函数的每个可能路径,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]总是等于零怎么办? 那么你现在不初始化minn或index。 然而在函数结束时,您尝试使用index的值从数组amd获取一个整数,然后返回minn(仍然等于空)。

这是你从编译器得到的问题。 它可以看到这种潜在的结果,并警告你,由于这些整数永远不会得到一个值,你的函数可能会被破坏。 要修复它,请执行其他玩家建议的操作,并让index和minn在开始时等于零。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM