2017-02-23 10 views
0

Я только начал программировать и задать вопрос начинающему, я пишу функцию вставки три, которая вставляет строку в дерево trie. Но когда я добавляю строку с более чем двумя символами, я получаю переполнение буфера кучи. Вот моя вставка функция:C программирование trie tree insert

struct node* insert(struct node *root,char *c){ 
int i=0; 
struct node *temp=root; 
while(c[i]){ 
int index=c[i]-'a'; 
//New Node 
struct node *n=malloc(sizeof(*n)); 
n=malloc(sizeof(struct node)); 
temp->child[index]=n; 
i++; 
temp=temp->child[index]; 
} 
return root; 
}; 

Определение узла дерева

struct node 
{ 
int isword; 
int prefix; 
int occurrence; 
int leaf; 
struct node * child[26]; 
}; 

и как я назвал их

char *c=malloc(3*sizeof(char)); 
c[0]='a'; 
c[1]='d'; 
c[2]='e'; 
struct node *root=malloc(sizeof(*root)); 
root=malloc(sizeof(struct node)); 
insert(root,c); 

Я думаю, что это, как я выделить пространство в функции вставки для новый узел, который поступил не так, но я не уверен, что это правильный способ избежать переполнения буфера кучи, любые советы, пожалуйста?

ответ

1

c не заканчивается на nul. Таким образом, c [i] не определено, если i>=3 (может быть, coredump, поскольку имеет доступ к неверному адресу памяти). while(c[i]) может работать более 3 раз. Это, может быть, и дело.

char *c=malloc(3*sizeof(char)); 
c[0]='a'; 
c[1]='d'; 
c[2]='e'; 

кстати, ниже код вызовет утечку памяти:

struct node *root=malloc(sizeof(*root)); 
root=malloc(sizeof(struct node)); 
+0

Так что я должен сделать что-то вроде с [3] = '\ 0' ;? – woshidashen

+0

и для выделения памяти предполагается, что это узел struct * root = (struct node *) malloc (sizeof (struct node)); вместо этого? – woshidashen

+0

@GhostKidYao 1. да, но почему бы не 'char * c =" ade ";', так как 'c' только для чтения? 2. Да. – zzn