Redimensionnement d’un tableau avec C

Je dois créer un tableau de structures dans un jeu que je crée – mais je ne veux pas limiter le tableau à une taille fixe. On me dit qu’il existe un moyen d’utiliser realloc pour agrandir le tableau quand il le faut, mais je ne trouve aucun exemple concret de cela.

Quelqu’un pourrait-il me montrer comment faire cela?

Commencez par créer le tableau:

structName ** sarray = (structName **) malloc(0 * sizeof(structName *)); 

Toujours garder une trace de la taille séparément:

 size_t sarray_len = 0; 

Pour augmenter ou tronquer:

 sarray = (structName **) realloc(sarray, (sarray_len + offset) * sizeof(structName *)); 

Puis définissez la taille:

 sarray_len += offset; 

Heureux d’aider et espère que cela aide.

La fonction realloc peut être utilisée pour agrandir ou réduire un tableau. Lorsque le tableau s’agrandit, les entrées existantes conservent leur valeur et les nouvelles entrées ne sont pas initialisées. Cela peut soit se développer sur place, soit, si cela n’est pas possible, allouer un nouveau bloc ailleurs en mémoire (et en coulisse, copier toutes les valeurs dans le nouveau bloc et libérer l’ancien).

La forme la plus basique est:

 // array initially empty T *ptr = NULL; // change the size of the array ptr = realloc( ptr, new_element_count * sizeof *ptr ); if ( ptr == NULL ) { exit(EXIT_FAILURE); } 

La multiplication est due au fait que realloc attend un nombre d’octets, mais vous voulez toujours que votre tableau contienne le bon nombre d’éléments. Notez que ce modèle pour realloc signifie que vous ne devez pas répéter T ailleurs dans votre code que la déclaration d’origine de ptr .

Si vous voulez que votre programme puisse récupérer d’un échec d’allocation au lieu de exit vous devez conserver l’ancien pointeur au lieu de l’écraser avec NULL:

 T *new = realloc( ptr, new_element_count * sizeof *ptr ); if ( new == NULL ) { // do some error handling; it is still safe to keep using // ptr with the old element count } else { ptr = new; } 

Notez que réduire un tableau via realloc risque de ne pas restituer de la mémoire au système d’exploitation. la mémoire peut restr la propriété de votre processus et être disponible pour les prochains appels à malloc ou realloc .

De http://www.cplusplus.com/reference/clibrary/cstdlib/realloc/

 /* realloc example: rememb-o-matic */ #include  #include  int main () { int input,n; int count=0; int * numbers = NULL; do { printf ("Enter an integer value (0 to end): "); scanf ("%d", &input); count++; numbers = (int*) realloc (numbers, count * sizeof(int)); if (numbers==NULL) { puts ("Error (re)allocating memory"); exit (1); } numbers[count-1]=input; } while (input!=0); printf ("Numbers entered: "); for (n=0;n