2012-02-23 13 views
1

各ノードにハッシュテーブルを持つリンクリストがあります。ハッシュテーブルは、構造体へのポインタの配列によって実装されます。これの全体の管理は、リンクされたリストへのグローバルな静的ポインタによって行われます。C - ポインタの配列への構造体へのポインタ

  • 私は少し質問を変更しました!今質問はより焦点が当てられています。検索で

とコードを短くするために関数を挿入私は

temp = cur_table->symbols_table[entry]; 

を割り当てるが、私は一時はすべての時間をNULLなっていることがわかります。 なぜそれが起こるのか理解できません。

コードは以下の3つのモジュールにあります。 ありがとうございます。

symbols.hファイル:静的

#include <stdlib.h> 
#include <stdio.h> 

#define TABLE_SIZE 26 

typedef struct symbol_node 
{ 
    char* name; 
    int type; 
    int role; 

    struct symbol_node* next; 

} symbol_node; 

typedef struct table_node 
{ 
    struct symbol_node* symbols_table[TABLE_SIZE]; 
    struct table_node* prev; 
    struct table_node* next; 

} table_node; 


static struct table_node* cur_table; 

//functions declarations: 
void init_table(); 
int hash_function(char* id); 
symbol_node* lookup(char* id_name); 
symbol_node* insert(char* id_name); 
// debug 
void printtable(); 

symbols.c

void init_table() // creates the first node                                           
{ 
    int i = 0; 
    cur_table = NULL; 

    cur_table = (table_node*)malloc(sizeof(table_node)); 

    cur_table->prev = NULL; 
    cur_table->next = NULL; 

    for(i=0; i < TABLE_SIZE; i++) 
    { 
     cur_table->symbols_table[i] = NULL; 
    } 
} 

symbol_node* lookup(char* id_name) // returns null if the id name not found                                  
{ 
    symbol_node* result = NULL; 
    symbol_node* temp = NULL; 
    int entry = atoi(id_name); 

    temp = cur_table->symbols_table[entry]; 

    while(temp != NULL) 
    { 
     if(strcmp(id_name, temp->name) == 0) 
    { 
      result = temp; 
      break; 
     } 
     else 
     temp = temp->next; 
    } 

    return result; 
} 


symbol_node* insert(char* id_name) 
{ 
    symbol_node* result = NULL; 
    symbol_node* temp = NULL; 
    int index = -1; 

    if(lookup(id_name)==NULL) 
    { 
     index = atoi(id_name); 
     temp = cur_table->symbols_table[index]; 

     while(temp!=NULL) 
     { 
      temp = temp->next; 
     } 

     temp = (symbol_node*)malloc(sizeof(symbol_node)); 
     temp->next = NULL; 
     temp->name = id_name; 
     // TODO: other params                                               

     result = temp; 
    } 

    return result; 
} 
void printtable() 
{ 
int i=0; 

for(i=0; i<TABLE_SIZE; i++) 
{ 
    if(cur_table->symbols_table[i]==NULL) 
     printf("NULL at index %d\n",i); 
    else 
     printf("There are something\n"); 
} 
} 

main.cの

void main() 
{ 
int i=0; 
symbol_node* t = NULL; 
symbol_node* tt = NULL; 
init_table(); 

t = insert("markhit"); 
t = insert("mark"); 

tt = lookup("mark"); 

printtable(); 

_getch(); 

    free(t); 
    free(tt); 
    free(cur_table); 
} 
+1

ランタイムエラーメッセージは何ですか?デバッガでコードを実行したときに何を学びましたか? –

+0

実行時エラーはアクセス違反です。私はinit関数を作成しましたが、メインポインタ "cur_table"が初期化されていないように見えます。 – NickF

+1

このコードは私にとってはうまく動作し、main関数に戻る前にfree()ステートメントを追加すると、valgrindによって漏れが検出されることはありません。 – Coren

答えて

-1

避けるメモリ割り当て[ `のmalloc ']。それを試す

cur_table = new table_node; 

静的に割り当てられたメモリの場合、メモリの理由で値を設定できません。あなたが挿入しているときにあなたの割り当てを変更していないcur_table

+0

"new"はCではなくC++です。 –

+0

'cur_table'ポインタは他のhファイルで定義されているため問題です。しかし、挿入機能には別の問題があります。私が 'temp = cur_table-> symbols_table [index];'を割り当てると、一時はNULLのままです。 – NickF

関連する問題