0

汎用ハッシュ テーブル内の汎用リンク リストへのポインターの配列を、ユーザー入力に依存するサイズで動的に割り当てようとしています。コードを見せてください。

これがドライバーです。ユーザーはハッシュ テーブルに必要なサイズを入力します。これは、ハッシュ テーブルに存在するリンク リストの数に直接相関します。

int main(int argc, char **argv)
{   
int i;
int n;
int count;
unsigned int seed=0;

HashObjectPtr job;
HashTablePtr table;

if (argc < 2) {
    fprintf(stderr, "Usage: %s <table size> [<test size=table size * 10>]);
    exit(1);
}
n = atoi(argv[1]);
count = n;
if (argc >=  3) {
    count = atoi(argv[2]);
    count *= 10;
}
if (argc == 4) {
    seed = atoi(argv[3]);
}
char * firstInput = (char *)malloc(sizeof(char) * 
strlen("I'm a void star made at the beginning") + 1);
firstInput = strcpy (firstInput, "I'm a void star made at the beginning");
table = createHashTable(n, getKey, toString, freeHashObject, compare);

for (i=0; i<n; i++)
{
    job = createHashObject(firstInput);
    HashInsert(table, job);
}

runRandomTests(count, seed, n, table);

if (DEBUG > 0)
    PrintHash(table);
free(firstInput);
FreeHashTable(table);
exit(
}

これが構造体です。リンクされたリストの配列が定義されています ListPtr * table => linkedList ** table;

typedef struct HashTable HashTable;
typedef struct HashTable * HashTablePtr;

struct HashTable {
int tableSize;
int (*getKey)(void *);
char *  (*toString)(void *);
void (*freeHashObject)(void *);
Boolean (*compare)(void *, void *);
ListPtr * table;
};

HashTablePtr createHashTable(int size, int (*getKey)(void *), char *  (*toString)(void *), void (*freeHashObject)(void *), Boolean (compare)(void *, void *));
void HashInsert(HashTablePtr table, HashObjectPtr object);
HashObjectPtr HashSearch (HashTablePtr table, HashObjectPtr obj);
void PrintHash(HashTablePtr table);
void FreeHashTable(HashTablePtr table);
HashObjectPtr HashRemove(HashTablePtr table, HashObjectPtr obj);
int HashFunction(HashObjectPtr obj);

これは、リンクされたリストを初期化する関数です。

HashTablePtr createHashTable(int size, int (*getKey)(void *), char * (*toString)(void *), void (*freeHashObject)(void *), Boolean (*compare)(void *, void *))
{
HashTablePtr h = (HashTablePtr)malloc(sizeof(HashTable));
h -> tableSize = size;
h -> getKey = getKey;
h -> toString = toString;
h -> freeHashObject = freeHashObject;
h -> compare = compare;

h -> table = (ListPtr *)malloc(sizeof(ListPtr)*size);
int i;
for (i = 0; i < size; i++)
{
    h -> table[i] = createList(getKey, toString, freeHashObject);
}
}

これは、リンクされたリストを作成する関数です

ListPtr createList(int(*getKey)(void *), 
               char * (*toString)(void *),
               void (*freeHashObject)(void *))
{
ListPtr list;
list = (ListPtr) malloc(sizeof(List));
list->size = 0;
list->head = NULL;
list->tail = NULL;
list->getKey = getKey;
list->toString = toString;
list->freeObject = freeHashObject;
return list;
}

私はEclipseのデバッガーでこれをステップスルーし、コンパイルして正常に実行していますが、CreateHashTable関数の実行中にh内の「テーブル」変数をクリックすると、すべてが正常に見え、ループが繰り返され、各インデックスでリストが作成されます。しかし、挿入しようとすると、セグメンテーション違反が発生します。

ListPointers の配列を初期化する方法が必要ですが、これ以上の方法は思いつきませんでした。

助けてください?

ありがとうございました

4

0 に答える 0