Cómo usar realloc en una función en C [duplicar]


Esta pregunta ya tiene una respuesta aquí:

Construyendo sobre lo que aprendí aquí: Manipulando matriz dinámica a través de funciones en C.

void test(int data[])
{
    data[0] = 1;    
}    

int main(void)
{    
    int *data = malloc(4 * sizeof *data);

    test(data);

    return 0;
}

Esto funciona bien. Sin embargo, también estoy tratando de usar realloc en una función.

void increase(int data[])
{
    data = realloc(data, 5 * sizeof *data);    
}

Esto cumple pero el el programa se bloquea cuando se ejecuta.

Pregunta

¿Cómo debería usar realloc en una función?

Entiendo que debo asignar el resultado de realloc a una variable y comprobar si es NULL primero. Este es solo un ejemplo simplificado.

Author: Community, 2012-12-06

3 answers

Desea modificar el valor de un int* (su matriz), por lo que debe pasarle un puntero a su función increase:

void increase(int** data)
{
    *data = realloc(*data, 5 * sizeof int);
}

El código de llamada se vería como:

int *data = malloc(4 * sizeof *data);
/* do stuff with data */
increase(&data);
/* more stuff */
free(data);
 28
Author: simonc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-06 16:43:29

Tenga en cuenta la diferencia entre un puntero y un array.
Una matriz es un trozo de memoria en la pila, y eso es todo.Si tiene un array:

int arr[100];

Entonces arr es una dirección de memoria, pero también & arr es una dirección de memoria, y esa dirección de memoria es constante, no almacenada en ninguna location.So no se puede decir arr = NULL, ya que arr no es una variable que apunte a something.It es solo una dirección simbólica: la dirección de donde comienza la matriz.En su lugar, un puntero tiene su propia memoria y puede apuntar a direcciones de memoria.

Es suficiente que cambies int [] a int*.
Además, las variables se pasan por copia, por lo que debe pasar un int** a la función.

Acerca de cómo usando realloc, todos los ejemplos didácticos incluyen esto:

  1. Use realloc;
  2. Compruebe si es NULL.In este caso usa perror y sale del programa;
  3. Si no es NULL utilice la memoria asignada;
  4. Libera la memoria cuando no la necesites nunca más.

Por lo que sería un buen ejemplo:

int* chuck= (int*) realloc (NULL, 10*sizeof(int)); // Acts like malloc,
              // casting is optional but I'd suggest it for readability
assert(chuck);
for(unsigned int i=0; i<10; i++)
{
    chunk[i]=i*10;
    printf("%d",chunk[i]);
}
free(chunk);
 6
Author: Ramy Al Zuhouri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-06 16:54:50

Ambos códigos son muy problemáticos, si usa el mismo puntero para enviar y recibir de realloc, si falla, perderá su puntero para liberarlo más tarde.

Deberías hacer algo como esto:

{ ... ...

more = realloc(area , size);
if( more == NULL )
    free(area);
else
    area=more;

... ...

}

 2
Author: user8036942,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-19 13:23:54