我正在学习散列表数据结构,我想用一个灵活长度的指向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;
}
}
}
第二个代码块完美运行。任何见解将不胜感激。谢谢你的时间。 克里斯
答案 0 :(得分:3)
您应该将内存分配为
HashTable *newHT = malloc(sizeof *newHT + size * sizeof newHT->Table[0]);
答案 1 :(得分:1)
你的
HashTable *newHT = malloc(sizeof(HashTable));
是错误的,因为灵活的阵列成员没有给出空间。应该是
HashTable *newHT = malloc(sizeof(HashTable)+size*sizeof(Link*));