Nunca he usado la función realloc, y ahora utilizandola me pregunto algunas cosas: Cuando utilizo la funcion, el compilador me fuerza un poco a que utilize un valor de retorno. Por ello he hecho el siguiente programa:
Las dudas que me surgen son... ¿El valor de retorno de realloc apunta a la nueva dirección con los datos que contenía el primer argumento (en este caso a[0] debería ser 20 y tendría que tener espacio para un int más)? ¿Que es lo que ocurre si hago free ( b ); y continuo usando a?
¿Que es lo que ocurre si hago free ( b ); y continuo usando a?
al hacer free, el programa marca el segmento de memoria dado como libre y si lo sigues usando podria ser sobreescrito en cualquiero otro momento por otra variable de tu programa.
¿El valor de retorno de realloc apunta a la nueva dirección con los datos que contenía el primer argumento (en este caso a[0] debería ser 20 y tendría que tener espacio para un int más)?
Si el valore regresado es el nuevo, podria ser el mismo o no, sin embargo veo que estas asignando a la variable "a" pero sigues usando "b", en el caso de que te devuelva una direccion diferente, b ya no aputara mas a un rango de memoria "asignado". b continua con una copia vieje del apuntador.
Por cierto asegurate de Inicializar la variable que le pasas por primera vez a realloc en NULL ya que es posible que contenga basura en la memoria y te marque segment fault Tengo aqui un video que realice sobre el tema:
Saludos!
« Última modificación: 6 Septiembre 2016, 17:02 pm por AlbertoBSD »
Muy simple. Trata de reservar un bloque de memoria del nuevo tamaño y preserva los datos del bloque anterior.
El retorno es la dirección del nuevo bloque de memoria, así que tienes que guardarlo siempre (igual que haces con malloc). El antiguo bloque, se libera automáticamente, no tienes que hacerlo tú.
Ahora bien, hay 2 casos especiales: El primero, es que en vez de darte una dirección nueva, te den la misma dirección. Eso significa que simplemente se amplió el tamaño de ese bloque. El segundo, es que retorne NULL. Eso significa que no se ha podido reservar el bloque que has pedido. El bloque antiguo no e sliberado en este caso, sigue siendo funcional.
Si después del realloc haces free(b), y continuas usando a, pueden pasar varias cosas. La primera, que b ya no apunte a un bloque de memoria reservado. Esto nunca lo deberías hacer. La segunda, que a sea NULL, el caso especial. En este caso, tendrás un error. En caso de que la dirección de los bloques nocambie (el primer caso especial), estarás liberando el bloque, cosa que también será errónea.
En fin, todo esto es supérfluo, y se resume en el segundo párrafo de este mensaje.
Si hay inconveniente ya que si por ejemplo en el realloc se mueve el bloque de memoria a otro lado, b va a seguir con el mismo apuntador.
Esto es
B apunta a 1000 (Direccion de memoria) Se pide a reelloc que reasigne el espacio para agregar X cantidad adicional a la existente. Realloc mueve el bloque que estaba en 1000 al bloque 2000 y retorna la nueva dirección de memoria Si B no se iguala a lo que devuelva realloc, entonces B seguira apuntado a 1000, si, ahi siguen tus valores anteriores, pero digamos que existe una variable C en la direccion 1003, entonces cuando tu escribas en tu apuntador B en esa posicion, estaras sobreescribiendo la variable C.