предупреждение: неинициализированная переменная // Но я инициализирован!Ошибка компилятора C ++? - PullRequest
6 голосов
/ 25 июля 2011

Я пытаюсь скомпилировать эту программу, но получаю предупреждение, и при запуске 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

Что я делаю не так? или это ошибка компилятора? :) Спасибо:)

Ответы [ 5 ]

17 голосов
/ 25 июля 2011

Вы объявили их, но не инициализировали их.Просто напишите int minn = 0, index = 0;, чтобы избежать предупреждения.Если вы не инициализируете переменную, ее значением по умолчанию будет то, что уже было в этом месте в памяти;обычно мусор.

Дело в том, что если num отрицательно, то ни один из циклов for в вашей функции min() не будет выполняться, и поэтому minn и index не будут присвоены значения,Тест if(i == num) также не выйдет из функции и предотвратит это.Таким образом, последние две строки функции будут иметь совершенно неопределенные результаты.

Иногда на самом деле не существует пути для использования переменных, неинициализированных;иногда компилятор просто не достаточно умен, чтобы понять все тонкости.Просто дайте им начальное значение, чтобы избежать предупреждения.

3 голосов
/ 25 июля 2011

Но вы их не инициализировали:)))) Пример: int i,minn=0,index=0; Представьте, что вы передаете num, равный 0, в конце вы возвращаете неинициализированное значение minn, а непосредственно перед этим вы установите mas[unknown_number]=0;, что, вероятно, приведет к сбою вашего приложения вы будете ссылаться на память, которая, скорее всего, выходит за рамки вашей компетенции. Вы должны сделать проверку в начале, как if(num<1)return -1;

3 голосов
/ 25 июля 2011

Декларация! = Инициализация.Когда вы объявляете их, переменные имеют случайные значения.Просто инициализируйте их разумными значениями, такими как -1 для индекса и minn для INT_MAX.

2 голосов
/ 25 июля 2011

Предположим, что весь передаваемый массив равен 0. Оба цикла закорачиваются и никогда не выполняются, а minn и index неинициализированы.

Теперь, если это произойдет, что должно происходить? Установите переменные в значения, которые достигают именно этого.

1 голос
/ 25 июля 2011

Как вы говорите в своем комментарии, да, у вас объявлено ваших переменных, но вы не инициализировали их. Инициализация переменной означает присвоение ей значения. Итак, в этом случае вы сказали компилятору, что вы хотите создать три целых числа, но вы не сказали ему, какие значения вы хотите сохранить в этих целых числах. Это было бы хорошо, если бы для каждого возможного пути через вашу функцию 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 равны нулю в начале.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...