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.
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);
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:
- Use realloc;
- Compruebe si es NULL.In este caso usa perror y sale del programa;
- Si no es NULL utilice la memoria asignada;
- 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);
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;
... ...
}
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