我试图编译这个程序,但是我收到警告,当我运行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
我做错了什么?或者它是编译器错误? :) 谢谢:))
答案 0 :(得分:17)
您已声明,但已初始化。只需编写int minn = 0, index = 0;
即可避免警告。如果不初始化变量,则其默认值为内存中该位置的任何值;通常是垃圾。
问题是,如果num
为否定,那么min()
函数中的for循环都不会执行,因此minn
和index
也不会指定值。 if(i == num)
测试也不会突破该功能并防止这种情况发生。因此,函数的最后两行将具有完全未定义的结果。
但有时候确实没有一条路径可以使用未初始化的变量;有时编译器不够聪明,无法弄清楚所有细微之处。只要给他们一个初始值,以避免警告。
答案 1 :(得分:3)
宣言!=初始化。声明它们时,变量具有随机值。只需将它们初始化为合理的值,例如-1表示索引,minn表示INT_MAX。
答案 2 :(得分:3)
但你还没有初始化它们:))))
EX:int i,minn=0,index=0;
想象一下,您传递等于num
的{{1}},最后您将返回未初始化的0
值,在此之前您将设置minn
这可能会导致您的应用程序崩溃,因为您将引用最有可能超出范围的内存。你应该像mas[unknown_number]=0;
答案 3 :(得分:2)
假设传入的整个数组都是0.两个循环都是短路而且从不执行,minn和index都是未初始化的。
现在如果发生这种情况,应该发生什么?将变量设置为完成该变量的值。
答案 4 :(得分:1)
正如您在评论中所说,是的,您已声明您的变量,但您尚未初始化它们。初始化变量意味着给它一个值。所以在这种情况下,你告诉编译器你要创建三个整数,但是你没有告诉它你要在那些整数中存储什么值。如果,对于通过函数的每个可能路径,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在开始时等于零。