各ノードにハッシュテーブルを持つリンクリストがあります。ハッシュテーブルは、構造体へのポインタの配列によって実装されます。これの全体の管理は、リンクされたリストへのグローバルな静的ポインタによって行われます。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);
}
ランタイムエラーメッセージは何ですか?デバッガでコードを実行したときに何を学びましたか? –
実行時エラーはアクセス違反です。私はinit関数を作成しましたが、メインポインタ "cur_table"が初期化されていないように見えます。 – NickF
このコードは私にとってはうまく動作し、main関数に戻る前にfree()ステートメントを追加すると、valgrindによって漏れが検出されることはありません。 – Coren