initialisation d’un tableau flexible de pointeurs de structure dans une structure en c

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*));