0

私はハッシュテーブルのデータ構造を学んでおり、ハッシュテーブルの初期化が初期化関数への長さの入力になるように配列を設定するように、構造体リンク (リンクされたリストの断片) へのポインターの柔軟な長さの配列を持つハッシュテーブルを作成したいと考えています。

最初は、「柔軟な配列が構造体の最後にありません」というエラーが表示されました。最後に (示されているように) プログラムがクラッシュします (ただし、コンパイルは行われます)。これは私のコードです:

typedef struct Link{
    int key;
    char *name;
    struct Link *next;
} Link;

typedef struct HashTable{
    int numberOfEntries;
    int numberOfBuckets;
    Link *Table[];
} HashTable;

HashTable *hashtableInit(int size){
    HashTable *newHT = malloc(sizeof(HashTable));
        if (newHT != NULL){
            newHT->numberOfEntries = 0;
            newHT->numberOfBuckets = size;
            for (int i = 0; i < newHT->numberOfBuckets; i += 1){
                newHT->Table[i] = NULL;
            }
            return newHT;
        } else {
            printf("Error in memory allocation.\n");
            fflush(stdout);
            return NULL;
        }
    }
}

配列を定数に設定し、同じ値を init 関数に入力すると機能します。

#define SIZE 11

typedef struct Link{
    int key;
    char *name;
    struct Link *next;
} Link;

typedef struct HashTable{
    Link *Table[SIZE];        
    int numberOfEntries;
    int numberOfBuckets; 
} HashTable;

HashTable *hashtableInit(int size){ // works if SIZE is passed into function as size parameter
    HashTable *newHT = malloc(sizeof(HashTable));
        if (newHT != NULL){
            newHT->numberOfEntries = 0;
            newHT->numberOfBuckets = size;
            for (int i = 0; i < newHT->numberOfBuckets; i += 1){
                newHT->Table[i] = NULL;
            }
            return newHT;
        } else {
            printf("Error in memory allocation.\n");
            fflush(stdout);
            return NULL;
        }
    }
}

2 番目のコード ブロックは完全に機能します。どんな洞察も大歓迎です。御時間ありがとうございます。クリス

4

2 に答える 2

3

次のようにメモリを割り当てる必要があります

HashTable *newHT = malloc(sizeof *newHT + size * sizeof newHT->Table[0]);
于 2013-11-03T01:28:59.027 に答える
1

君の

 HashTable *newHT = malloc(sizeof(HashTable));

柔軟な配列メンバーにスペースが与えられていないため、間違っています。おそらくあるはずです

 HashTable *newHT = malloc(sizeof(HashTable)+size*sizeof(Link*));
于 2013-11-03T01:28:26.750 に答える