Expandiendo una matriz con malloc

2 minutos de lectura

Avatar de usuario de Mal Ock
mal ok

Soy un poco nuevo en malloc y C en general. Quería saber cómo puedo, si es necesario, extender el tamaño de una matriz de tamaño fijo con malloc.

Ejemplo:

#define SIZE 1000
struct mystruct
{
  int a;
  int b;
  char c;
};
mystruct myarray[ SIZE ];
int myarrayMaxSize = SIZE;
....
if ( i > myarrayMaxSize )
{
   // malloc another SIZE (1000) elements
   myarrayMaxSize += SIZE;
}
  • El ejemplo anterior debe dejar en claro lo que quiero lograr.

(Por cierto: necesito esto para un intérprete que escribo: trabaje con una cantidad fija de variables y, en caso de que se necesiten más, simplemente asígnelas dinámicamente)

Avatar de usuario de i_am_jorf
soy_jorf

Usar reasignar, pero primero debe asignar la matriz con malloc. Lo estás asignando en la pila en el ejemplo anterior.

   size_t myarray_size = 1000;
   mystruct* myarray = malloc(myarray_size * sizeof(mystruct));

   myarray_size += 1000;
   mystruct* myrealloced_array = realloc(myarray, myarray_size * sizeof(mystruct));
   if (myrealloced_array) {
     myarray = myrealloced_array;
   } else {
     // deal with realloc failing because memory could not be allocated.
   }

  • x = realloc(x, newsize) es una fuga de memoria esperando a suceder.

    – R. Samuel Klatchko

    30 de abril de 2010 a las 22:38

  • Buen punto. Actualicé el código de ejemplo para manejar fallas de realloc.

    – yo_soy_jorf

    30 de abril de 2010 a las 23:04

  • myarray = myrealloced_array) debiera ser myarray = myrealloced_array; 🙂

    – Saulo

    30 de abril de 2010 a las 23:14


  • No necesariamente tiene que asignar con malloc() primero: “si ptr es un puntero nulo, la función realloc se comporta como la función malloc para el tamaño especificado”

    – Michael Burr

    30 de abril de 2010 a las 23:26

  • La programación es difícil. 🙂

    – yo_soy_jorf

    12 de noviembre de 2014 a las 18:14

Desea usar realloc (como ya han señalado otros carteles). Pero desafortunadamente, los otros carteles no le han mostrado cómo usarlo correctamente:

POINTER *tmp_ptr = realloc(orig_ptr, new_size);
if (tmp_ptr == NULL)
{
    // realloc failed, orig_ptr still valid so you can clean up
}
else
{
    // Only overwrite orig_ptr once you know the call was successful
    orig_ptr = tmp_ptr;
}

necesitas usar tmp_ptr para que si realloc falla, no pierde el puntero original.

Avatar de usuario de Steve Jessop
steve jesop

No, no puedes. No puede cambiar el tamaño de una matriz en la pila una vez que está definida: eso es lo que significa tamaño fijo. O una matriz global, tampoco: no está claro en su ejemplo de código dónde myarray se define.

Tú podrías malloc una matriz de 1000 elementos, y luego cambiar su tamaño con realloc. Esto puede devolverle una nueva matriz, que contiene una copia de los datos de la anterior, pero con espacio adicional al final.

a) no usó malloc para crearlo, por lo que no puede expandirlo con malloc. Hacer:

  mystruct *myarray = (mystruct*)malloc(sizeof( mystruct) *SIZE);

b) use realloc (RTM) para hacerlo más grande

¿Ha sido útil esta solución?