uso - sintaxis free en c
Cómo usar realloc en una función en C (3)
Ambos códigos son muy problemáticos, si usa el mismo puntero para enviar y recibir desde 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;
...
}
Esta pregunta ya tiene una respuesta aquí:
Sobre la base de lo que aprendí aquí: la manipulación de matrices dinámicas 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 programa se bloquea cuando se ejecuta.
Pregunta
¿Cómo debo usar realloc en una función?
Entiendo que debo asignar el resultado de realloc
a una variable y verificar si es NULL
primero. Este es solo un ejemplo simplificado.
Desea modificar el valor de un int*
(su matriz), por lo que debe pasarle un puntero a su función de increase
:
void increase(int** data)
{
*data = realloc(*data, 5 * sizeof int);
}
El código de llamada se vería así:
int *data = malloc(4 * sizeof *data);
/* do stuff with data */
increase(&data);
/* more stuff */
free(data);
Tenga en cuenta la diferencia entre un puntero y una matriz.
Una matriz es un chuck de memoria en la pila, y eso es todo. Si tienes una matriz:
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 se almacena en ninguna ubicación. Por lo tanto, no puede decir arr = NULL, ya que arr no es una variable que apunta a algo. Es solo una dirección simbólica: la dirección donde comienza la matriz. En lugar de eso, el 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.
Sobre cómo usar realloc, todos los ejemplos didácticos incluyen esto:
- Use realloc;
- Compruebe si es NULL. En este caso, utilice perror y salga del programa;
- Si no es NULL use la memoria asignada;
- Libera la memoria cuando ya no la necesites.
Así que ese 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);