2010-05-30 24 views
15

Necesito tener una serie de estructuras en un juego que estoy haciendo, pero no quiero limitar la matriz a un tamaño fijo. Me dijeron que hay una forma de usar Realloc para hacer que la matriz sea más grande cuando lo necesita, pero no se encuentran ejemplos de esto.Cambiar el tamaño de una matriz con C

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

+4

Por favor, publique el código que ha escrito hasta ahora. En general, a la gente no le gusta escribir tu código por ti. –

+0

Por ejemplo: matriz dinámica de estructuras en C: http://stackoverflow.com/questions/260915/dynamic-array-of-structs-in-c –

+1

¿Qué hay del primer hit de google http://www.cplusplus.com/reference/clibrary/cstdlib/realloc /? ¿Qué has intentado hasta ahora? –

Respuesta

23

empezar por la creación de la matriz:

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

siempre un seguimiento de la talla por separado:

size_t sarray_len = 0; 

Para aumentar o truncar:

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

establezca el tamaño:

sarray_len += offset; 

dispuestos a ayudar y espero que ayude.

+8

La primera línea se mejoraría mucho escribiendo 'structName ** sarray = NULL;'. Está bien definido usar 'realloc' con un puntero nulo. –

+1

Tenga en cuenta que 'malloc (0)' tiene resultados definidos por la implementación; puede devolver NULL o un puntero válido que nunca se puede desreferenciar (pero se puede pasar a 'free()' o 'realloc()'). –

+0

Nitpicking: Esto no administra un "* array of structs *" sino una matriz de punteros a estructuras. – alk

6

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; 
} 
+2

¡Bad Pavel! ¡No publicar el código de otra persona! ¡Sin galletas! :) –

+10

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

8

La función realloc 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 otro lugar de la memoria (y detrás de las escenas, copiar todos los valores en el nuevo bloque y liberar el bloque anterior).

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 se debe a realloc espera un número de bytes, pero siempre quiere que su matriz para tener el número correcto de elementos. Tenga en cuenta que este patrón para realloc significa que no tiene que repetir T en ningún lugar de su código que no sea la declaración original de ptr.

si desea que su programa sea capaz de recuperarse de un error de asignación en vez de hacer exit entonces usted necesita para mantener el puntero de edad en lugar de sobrescribir 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 la reducción de una matriz a través realloc puede que no devuelva la memoria al sistema operativo; la memoria puede continuar siendo propiedad de su proceso y disponible para futuras llamadas al malloc o al realloc.

Cuestiones relacionadas