警告:未初始化变量//但我已初始化!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循环都不会执行,因此minn
和index
将不会被赋值。if(i == num)
测试也不会破坏该功能并防止这种情况发生。因此,函数的最后两行将具有完全未定义的结果。
不过,有时确实没有一条未初始化的变量使用路径;有时编译器不够聪明,无法理解所有的细微之处。只要给它们一个初始值就可以避免警告。
声明!=初始化。当您声明它们时,变量具有随机值。只需将它们初始化为合理的值,如-1表示index,minn表示INT_MAX。
但是您还没有初始化它们:((例如:int i,minn=0,index=0;
假设您传递等于0
的num
,最后您将返回未初始化的minn
值,而在此之前,您将设置mas[unknown_number]=0;
,这可能会导致您的应用程序崩溃,因为您将引用的内存很可能超出您的范围。您应该像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的值从数组amd中获取一个整数,然后返回minn(仍然等于零(。
这就是你从编译器那里得到的问题。它可以看到这种潜在的结果,并警告您,由于这些整数永远不会得到值,您的函数可能会被破坏。要解决这个问题,按照其他小伙子的建议,让index和minn在一开始就等于零。
- 使用默认构造函数引用成员变量初始化错误
- 交换机案例语句中的初始化错误
- 英特尔 MKL 稀疏 QR 求解 C++ 返回未初始化错误
- 在模板类中使用"this"会导致参数初始化错误
- 映射的映射集的映射初始化错误
- C++图形初始化错误(语法或丢失文件缺陷?
- QSQLDATABASE:SIGSEV初始化错误
- 映射的 std::for_each() 给出无效的初始化错误
- 初始化错误过多
- C++初始化错误 std::set
- 简单的类构造函数初始化错误
- 组合框初始化错误:无法读取未定义的属性'constructor'
- OpenCV卡尔曼滤波器初始化错误
- C++11动态数组部分列表初始化(错误或误解)
- C++ 静态变量在发布模式下初始化错误
- Visual Studio 2010 SP1 中的 64 位整数初始化错误
- C++libPNG-简单初始化错误
- 结构数组-初始化错误
- 初始化错误
- 我不断收到函数初始化错误.(运行时检查失败 #3)