Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Iam trying to compile this program but i get warning and when i run vc++ 2010 debugger pops up : ( Here is my code :

#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);

}

and Here is a compiler log :

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

What i am doing wrong ? or its is compiler bug ? :) Thank you :)

like image 482
Davit Tvildiani Avatar asked Jul 25 '11 08:07

Davit Tvildiani


People also ask

What does it mean when a variable is uninitialized in C?

Description. The code uses a variable that has not been initialized, leading to unpredictable or unintended results. Extended Description. In some languages such as C and C++, stack variables are not initialized by default.

Are uninitialized variables null in C?

(However, default initialization to 0 is a right practice for pointers and arrays of pointers, since it makes them invalid before they are actually initialized to their correct value.) In C, variables with static storage duration that are not initialized explicitly are initialized to zero (or null, for pointers).

Will we get an error message if we display an uninitialized variable?

An uninitialized variable has an undefined value, often corresponding to the data that was already in the particular memory location that the variable is using. This can lead to errors that are very hard to detect since the variable's value is effectively random, different values cause different errors or none at all.

How do you know if a variable is uninitialized?

Use the typeof operator to check if a variable is defined or initialized, e.g. if (typeof a !== 'undefined') {} . If the the typeof operator doesn't return a string of "undefined" , then the variable is defined.


4 Answers

You have declared them, but not initialized them. Simply write int minn = 0, index = 0; to avoid the warning. If you don't initialize a variable, its default value is whatever was at that location in memory already; usually garbage.

The thing is, if num is negative, then neither of the for loops in your min() function will execute, and so minn and index will not have been assigned values. The if(i == num) test also won't break out of the function and prevent this from happening. So the last two lines of the function will have completely undefined results.

Sometimes there really isn't a path for the variables to be used uninitialized, though; sometimes the compiler just isn't quite smart enough to figure out all the subtleties. Just give them an initial value to avoid the warning.

like image 170
ptomato Avatar answered Oct 07 '22 15:10

ptomato


Declaration != initialization. When you declare them the variables have random values. Just initialize them to sensible values like -1 for index and minn to a INT_MAX.

like image 26
Kugel Avatar answered Oct 07 '22 15:10

Kugel


But you haven't initialized them : )))) EX: int i,minn=0,index=0; Imagine that you pass num that equals 0, at the end you would be returning uninitialized value of minn and just before that you would set mas[unknown_number]=0; which will probably cause your app to crash since you will be referencing memory that is most likely beyond your scope. You should do a check in the beggining like if(num<1)return -1;

like image 3
Djole Avatar answered Oct 07 '22 17:10

Djole


Suppose the entire array you pass in is 0. Both loops short-circuit and never execute, both minn and index are uninitialized.

Now if this happens, what should be happening? Set the variables to the values that accomplish just that.

like image 2
dascandy Avatar answered Oct 07 '22 17:10

dascandy