C 条件跳转或移动取决于单初始化值

C 条件跳转或移动取决于单初始化值,c,hash,valgrind,C,Hash,Valgrind,我从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;

我从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;
}
呼叫代码是

  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
   }

这看起来像是对
feof()
功能的误解。在由于EOF导致读取失败之前,它不会返回真值。因此,在上一次迭代中,
fscanf()
调用失败,因此不会初始化
n->word
。您应该检查
fscanf()
的返回值。如果点击EOF,则返回C值
EOF
。您还可以检查值
1
,该值指示单个字段已成功转换。

这似乎是对
feof()
功能的误解。在由于EOF导致读取失败之前,它不会返回真值。因此,在上一次迭代中,
fscanf()
调用失败,因此不会初始化
n->word
。您应该检查
fscanf()
的返回值。如果点击EOF,则返回C值
EOF
。您还可以检查值
1
,该值指示单个字段已成功转换。

如何获得
str
?显示呼叫方代码。您如何获取
str
?显示调用方代码。但如果feof失败,则节点*n将不会被malloc'd。然后if循环应该捕获它。
feof()
直到读取失败后才会返回true。但是在代码读取失败和检查EOF之间,它会尝试使用它(没有)读取的值。但是如果feof失败,那么节点*n将不会被malloc'd。然后if循环应该捕获它。
feof()
直到读取失败后才会返回true。但是在代码读取失败和检查EOF之间,它会尝试使用它(没有)读取的值。
  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
   }