Условный переход или перемещение зависит от неинициализированных значений - PullRequest
0 голосов
/ 28 января 2012

Я получаю следующую ошибку от valgrind. Условный переход или перемещение зависит от неинициализированных значений. Я смотрел вокруг на подобные вопросы, но я не могу выяснить, что не так. Я инициализировал все переменные, но все же ..

unsigned long hash_word(const char *str)
 {
  unsigned long hash = 5381;
  int c = 0;

  while((c = *str)) // The error occurs here
   {
    hash = ((hash<<5) + hash) + c;
    str++;
   }

 return hash%1999099;
}

Значение str передается из главной функции. Я использую проверку на утечку = полное и отслеживание происхождения = да. Заранее спасибо за помощь.

Сначала я инициализирую узел.

    typedef struct node{
     char word[46];
     struct node *next;
  } node;

Телефонный код

  while(!(feof(fp)))
 {
   node *n =  malloc(sizeof(node));
   if (n == NULL)
    {
     return false;
    }
   else
    {
     fscanf(fp,"%s",n->word);

     index = hash_word(n->word);
     .
     .
     .    // further code
   }

1 Ответ

3 голосов
/ 28 января 2012

Это похоже на недоразумение в том, что делает feof(). Он не возвращает истинное значение до тех пор, пока после чтение не завершится из-за EOF. Следовательно, в вашей последней итерации вызов fscanf() завершается неудачно и, следовательно, не инициализирует n->word. Вам следует проверить возвращаемое значение fscanf(). Если он достигает EOF, он возвращает значение C EOF. Вы также можете проверить значение 1, указывающее, что одно поле было успешно преобразовано.

...