0

我正在学习哈希表数据结构,我想用一个灵活长度的指向 struct Link(链表片段)的指针数组制作一个哈希表,以便哈希表初始化会将数组设置为初始化函数的长度输入。

起初我收到错误“灵活数组不在结构末尾”。当它结束时(如图所示)程序崩溃(但它仍然编译)。这是我的代码:

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;
        }
    }
}

第二个代码块完美运行。任何见解将不胜感激。谢谢你的时间。克里斯

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 回答