2016-09-22 97 views
-1

我有以下结构:初始化的结构,它包含一个指向数组

typedef struct TRIE_NODE 
{ 
    char* word; 
    struct TRIE_NODE* node[26]; 
}TRIE_NODE; 

我创建一个名为头,TRIE_NODE *head = NULL;节点,然后我尝试使用以下函数来初始化该节点:

void initialize_node(TRIE_NODE *current_node) 
{ 
    int MAX = 25; 

    current_node = malloc(sizeof(TRIE_NODE)); 

    for(int i = 0; i < MAX; i++) 
    { 
     current_node->node[i] = NULL; 
     if(current_node->node[i] == NULL) 
      printf("\n -- \n"); 
    } 
} 

但是,每当我尝试读取current_node->node[i]时,我都会遇到分段错误。有谁知道发生了什么?考虑到current_node->node是一个指针,指向另一个类型为TRIE_NODE的指针,我不应该通过括号表示法来访问它的值吗? (我试过取​​消引用过它,它不会编译)

+0

'node'是一个指针数组,而不是一个指针数组!不清楚你想完成什么。数组不是指针,反之亦然! – Olaf

+0

@Olaf是不是'node'指向一个可以容纳26个单元的'TRIE_NODE'的内存块?我只是试图将这26个单位初始化为空。 – Selhar

+0

我觉得我的评论很清楚。 **不,不是的! – Olaf

回答

2

你做正确的一切,除了这行

current_node = malloc(sizeof(TRIE_NODE)); 

其中修改的current_node本地副本。呼叫者中的指针保持不变。

要解决这个问题,一个指针传递给指针,并用间接运算符指定:

void initialize_node(TRIE_NODE **current_node_ptr) { 
    ... 
    *current_node_ptr = malloc(sizeof(TRIE_NODE)); 
    ... 
} 
+0

我想我明白了什么是错的,我的代码还没有编译,但是让我看看我的逻辑是否正确。我正在改变本地副本,这是有道理的,所以现在我会发送'&head',考虑到头已经是一个指针了,对吧?然后,每次我直接处理'current_node'时处理'* current_node'。 – Selhar

+0

@Selhar是的,没错。您需要在'* current_node_ptr'周围添加括号。 '(* current_node_ptr) - > node' – dasblinkenlight

+0

非常感谢!不仅它工作,但我明白我做错了什么。 – Selhar