条件跳转问题

Posted

技术标签:

【中文标题】条件跳转问题【英文标题】:Conditional jump problems 【发布时间】:2015-07-11 12:24:01 【问题描述】:

我正在使用 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 行上说“条件跳转或移动取决于未初始化的值”我该如何解决这个问题?

【问题讨论】:

首先,初始化应该是node->children = malloc(ALPHABET_SIZE*sizeof(struct TrieNode *));(注意额外的*...) 另外,我不相信这是你真正的代码。您已将 create_trienode 定义为接受一个参数,但在调用它时传递了两个参数。 这是一个错误 create_trienode 应该传递两个参数。谢谢*注,减去丢失字节的一半 在使用该值之前始终检查 (!=NULL) 从 malloc 返回的值 【参考方案1】:

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

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

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

【讨论】:

以上是关于条件跳转问题的主要内容,如果未能解决你的问题,请参考以下文章

比较条件跳转指令

多条件分支跳转指令

Valgrind:禁用条件跳转(或整个库)检查

汇编语言--条件跳转指令

x86汇编 条件跳转

根据条件插入行跳转,Bash Ubuntu