条件跳转问题

标签 c valgrind trie

我正在使用 valgrind 测试 trie,在第一个符号传递给函数 create_trienode 后出现“条件跳转或移动取决于未初始化的值”错误。

我有结构:

typedef struct TrieNode{
    struct TrieNode **children;
    bool is_word;
} TrieNode;

func create_trienode:

struct TrieNode *create_trienode(char c, struct TrieNode *parent){
    struct TrieNode *node = malloc(sizeof(struct TrieNode)); 
    node->children = malloc(ALPHABET_SIZE*sizeof(struct TrieNode*)); 
    node->is_word=false;
    return node; 
}

和 func create_tree

struct TrieNode *create_tree(FILE *file) 
{
struct TrieNode *root = create_trienode(' ', NULL);
struct TrieNode *ptr = root;
int character;
int converted;
int buffer;

//This handles if file does not end with a newline
character = fgetc(file);
buffer = fgetc(file);

while(character != EOF) 
{
  character = tolower(character);

  if (character == 10) // case newline
  {

  }
  else 
  if(isalpha(character))  
  {

      converted = character - 'a';
      if(ptr->children[converted] == NULL) // CONDITIONAL JUMP HERE
      {
          ptr->children[converted] = create_trienode(character, ptr);
      }

      ptr = ptr->children[converted];  

  }

  if (character == 92) 
  {
      if(ptr->children[ALPHABET_SIZE] == NULL) 
      {
          ptr->children[ALPHABET_SIZE] = create_trienode(character, ptr);
      }
      ptr = ptr->children[ALPHABET_SIZE];
  }

  if(ptr != root && (!(character == 92|| isalpha(character)) || buffer == EOF)) 


  {
      ptr->is_word = true;
      ptr = root;
      word_count++;
  }

  character = buffer;
  buffer = fgetc(file);
}

if(ptr->children[converted] == NULL) 行上,valgrind 说“条件跳转或移动取决于未初始化的值” 我该如何解决这个问题?

最佳答案

您将 ptr->children[converted]NULL 进行比较,但未将其初始化为任何值。

在 malloc 之后,空间不是 NULL,所以 ptr->children[converted] 不能是 'NULL',它可以是任何值。

要修复它,您可以在 malloc 之后将 ptr->children[converted] 初始化为 NULL。

关于条件跳转问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31357152/

相关文章:

c - 使用规则在矩形巧克力棒中找到最小数量的矩形 block

c - 错误: "Access not within mapped region at address" (Valgrind)

arrays - 具有恒定负载因子的尝试与桶数组的预期性能

c++ - Valgrind 在不终止程序的情况下检测内存泄漏

c - 结构体上的 free() 无效

java - 如何通过在相邻字符之间添加空格将一个单词分成两个单词

algorithm - 按频率降序列出以固定前缀开头的 `k` 个单词

c - 如何在一个以指针为参数的函数中访问另一个以指针为参数的函数中的值?

c - 什么时候应该使用 gcc 的 -m32 选项?

c - 替换字符串中的字符