Cambiar el tamaño de una matriz con C

4 minutos de lectura

avatar de usuario
Gary

Necesito tener una matriz de estructuras en un juego que estoy creando, pero no quiero limitar la matriz a un tamaño fijo. Me dijeron que hay una manera de usar realloc para hacer que la matriz sea más grande cuando sea necesario, pero no puedo encontrar ningún ejemplo funcional de esto.

¿Podría alguien mostrarme cómo hacer esto?

  • Por favor, publique el código que ha escrito hasta ahora. Por lo general, a la gente no le gusta simplemente escribir su código por usted.

    – Trigo Mitch

    30 de mayo de 2010 a las 3:27

  • Por ejemplo: matriz dinámica de estructuras en C: stackoverflow.com/questions/260915/…

    – Trigo Mitch

    30 de mayo de 2010 a las 3:29

  • ¿Qué tal el primer golpe de Google? cplusplus.com/reference/clibrary/cstdlib/realloc ? ¿Qué intentaste hasta ahora?

    – Nikolái Fetissov

    30 de mayo de 2010 a las 3:29

  • Tuve buena suerte buscando en Google ejemplo de reasignación

    – Greg Hewgill

    30 de mayo de 2010 a las 3:30

  • Vea aquí una solución más complicada que envuelve la matriz con su longitud

    –MM

    06/10/2014 a las 23:59

avatar de usuario
delan azabani

Comience creando la matriz:

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

Mantenga siempre un registro del tamaño por separado:

size_t sarray_len = 0;

Para aumentar o truncar:

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

Luego establece el tamaño:

sarray_len += offset;

Feliz de ayudar y espero que ayude.

  • La primera línea se mejoraría mucho si se escribiera structName ** sarray = NULL; . Está bien definido para usar realloc con un puntero nulo.

    –MM

    06/10/2014 a las 23:51

  • Tenga en cuenta que malloc(0) tiene resultados definidos de implementación; puede devolver NULL o un puntero válido que nunca puede ser desreferenciado (pero podría pasarse a free() o realloc()).

    –Jonathan Leffler

    2 de noviembre de 2014 a las 3:27

  • Nitpicking: Esto no gestiona un “matriz de estructuras” sino una matriz de punteros a estructuras.

    – alk

    4 de noviembre de 2017 a las 10:34

  • ¿No es esto solo del tamaño de un puntero? sizeof(structName *) ¿no es así? sizeof(structName)? Además, ¿por qué necesitamos un puntero doble?

    – mlestudiante33

    7 de julio de 2020 a las 2:44


los realloc La función se puede utilizar para aumentar o reducir una matriz. Cuando la matriz crece, las entradas existentes conservan su valor y las nuevas entradas no se inicializan. Esto puede crecer en el lugar o, si eso no fuera posible, puede asignar un nuevo bloque en otra parte de la memoria (y, en segundo plano, copiar todos los valores en el nuevo bloque y liberar el antiguo).

La forma más básica es:

// 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 multiplicación es porque realloc espera una cantidad de bytes, pero siempre desea que su matriz tenga la cantidad correcta de elementos. Tenga en cuenta que este patrón para realloc significa que no tienes que repetir T en cualquier parte de su código que no sea la declaración original de ptr.

Si desea que su programa pueda recuperarse de una falla de asignación en lugar de hacer exit entonces debe conservar el puntero anterior en lugar de sobrescribirlo con 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;
}

Tenga en cuenta que reducir una matriz a través de realloc puede que en realidad no devuelva la memoria al sistema operativo; la memoria puede seguir siendo propiedad de su proceso y estar disponible para futuras llamadas a malloc o realloc.

Desde 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;
}

  • Di referencia, lo que lo convierte en una cookie, ¿no?

    – Pavel Radzivilovsky

    30 de mayo de 2010 a las 4:40

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad