web-dev-qa-db-fra.com

Redimensionner un tableau avec c

J'ai besoin d'une gamme de structures dans un jeu que je fais - mais je ne veux pas limiter le tableau à une taille fixe. On me dit qu'il y a un moyen d'utiliser Realloc pour rendre la matrimonie plus grande quand elle doit, mais je ne trouve aucun exemples de travail.

Quelqu'un pourrait-il s'il vous plaît me montrer comment faire cela?

18
Gary

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;

Augmenter ou tronquer:

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

Puis réglez la taille:

sarray_len += offset;

Heureux d'aider et d'espérer que cela aide.

30
Delan Azabani

La fonction realloc peut être utilisée pour augmenter ou rétrécir un tableau. Lorsque le tableau augmente, les entrées existantes conservent leur valeur et les nouvelles entrées sont inintitualisées. Cela peut soit pousser en place, soit si cela n'était pas possible, cela peut allouer un nouveau bloc ailleurs dans la mémoire (et dans les coulisses, copier toutes les valeurs sur le nouveau bloc et libérer l'ancien bloc).

La forme la plus élémentaire est la suivante:

// 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 parce que realloc s'attend à un certain nombre d'octets, mais vous voulez toujours que votre réseau ait le bon nombre d'éléments. Notez que ce modèle pour realloc signifie que vous n'avez pas à répéter T n'importe où dans votre code autre que la déclaration originale de ptr.

Si vous souhaitez que votre programme puisse récupérer d'un échec de l'allocation au lieu de faire exit, vous devez retenir 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 la rétrécissement d'un tableau via realloc peut ne pas retourner la mémoire au système d'exploitation; La mémoire peut continuer à être possédée par votre processus et disponible pour les appels futurs à malloc ou realloc.

12
M.M

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

/* realloc example: rememb-o-matic */
#include <stdio.h>
#include <stdlib.h>

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<count;n++) printf ("%d ",numbers[n]);
  free (numbers);

  return 0;
}
8