J’apprends les structures de données hashtable et je veux créer une hashtable avec un tableau de longueur flexible de pointeurs à struct Link (éléments de liste liés), de sorte que l’initialisation de hashtable définisse le tableau comme une longueur entrée dans la fonction d’initialisation.
Au début, je recevais le message d’erreur “tableau flexible non à la fin de la structure”. Quand il est à la fin (comme indiqué), le programme se bloque (mais il comstack toujours). Ceci est mon code:
typedef struct Link{ int key; char *name; struct Link *next; } Link; typedef struct HashTable{ int numberOfEnsortinges; int numberOfBuckets; Link *Table[]; } HashTable; HashTable *hashtableInit(int size){ HashTable *newHT = malloc(sizeof(HashTable)); if (newHT != NULL){ newHT->numberOfEnsortinges = 0; newHT->numberOfBuckets = size; for (int i = 0; i numberOfBuckets; i += 1){ newHT->Table[i] = NULL; } return newHT; } else { printf("Error in memory allocation.\n"); fflush(stdout); return NULL; } } }
Cela fonctionne si je mets le tableau sur une constante et que je saisis la même valeur dans la fonction init:
#define SIZE 11 typedef struct Link{ int key; char *name; struct Link *next; } Link; typedef struct HashTable{ Link *Table[SIZE]; int numberOfEnsortinges; 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->numberOfEnsortinges = 0; newHT->numberOfBuckets = size; for (int i = 0; i numberOfBuckets; i += 1){ newHT->Table[i] = NULL; } return newHT; } else { printf("Error in memory allocation.\n"); fflush(stdout); return NULL; } } }
Le deuxième bloc de code fonctionne parfaitement. Toute idée serait grandement appréciée. Merci pour votre temps. Chris
Vous devriez allouer de la mémoire comme
HashTable *newHT = malloc(sizeof *newHT + size * sizeof newHT->Table[0]);
Votre
HashTable *newHT = malloc(sizeof(HashTable));
est incorrect, car aucun espace n’est donné pour le membre de groupe flexible. Devrait probablement être
HashTable *newHT = malloc(sizeof(HashTable)+size*sizeof(Link*));