elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Duda con realloc
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda con realloc  (Leído 3,414 veces)
mester

Desconectado Desconectado

Mensajes: 219


https://www.youtube.com/watch?v=IlY9C6pzxKc


Ver Perfil WWW
Duda con realloc
« en: 6 Septiembre 2016, 16:48 pm »

Hola.

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:

Código
  1. int main () {
  2.  int *a, *b = (int *) malloc (sizeof (int));
  3.  
  4.  b[0] = 20;
  5.  a = (int *)realloc (b, 2 * sizeof (int));
  6.  b[1] = 30;
  7.  
  8.  printf ("%p\n%p\n", &a, &b);
  9.  
  10.  return 0;
  11. }

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?


En línea

Justicia es dar a cada uno lo que se merece
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Duda con realloc
« Respuesta #1 en: 6 Septiembre 2016, 16:58 pm »

 ¿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.

Y en el caso del printf deberia de ser asi:

Código
  1. printf ("%p\n%p\n", a, b);


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 » En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Duda con realloc
« Respuesta #2 en: 6 Septiembre 2016, 17:01 pm »

http://www.cplusplus.com/reference/cstdlib/realloc/

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.
En línea

mester

Desconectado Desconectado

Mensajes: 219


https://www.youtube.com/watch?v=IlY9C6pzxKc


Ver Perfil WWW
Re: Duda con realloc
« Respuesta #3 en: 6 Septiembre 2016, 17:04 pm »

Pero, ¿es necesario que use un valor de retorno? Porque perfectamente podría hacer esto:
Código
  1. int main () {
  2.  int *b = (int *) malloc (sizeof (int));
  3.  
  4.  b[0] = 20;
  5.  realloc (b, 2 * sizeof (int));
  6.  b[1] = 30;
  7.  
  8.  printf ("%d\t%d\n", b[0], b[1]);
  9.  
  10.  return 0;
  11. }

¿Habría algún inconveniente?
En línea

Justicia es dar a cada uno lo que se merece
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Duda con realloc
« Respuesta #4 en: 6 Septiembre 2016, 17:34 pm »

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.

Ejemplo en video:



Para ejemplo esta el siguiente codigo:

Código
  1. #include<stdlib.h>
  2. #include<stdio.h>
  3.  
  4. int main() {
  5. int i = 0;
  6. int *B = NULL,*C = NULL;
  7. B = realloc(B,sizeof(int));
  8. C = realloc(C,sizeof(int));
  9. C[0] = 1000;
  10. printf("El valor de C[0] es %i\n",C[0]);
  11. realloc(B,sizeof(int)*10); //NO SE ACTUALIZA B
  12. while(i < 10) {
  13. B[i] = 1337;
  14. i++;
  15. }
  16. printf("El valor de C[0] es %i\n",C[0]);
  17. }

Salida:

Código:
El valor de C[0] es 1000
El valor de C[0] es 1337

Como vemos, por lo menos en mi computadora el valor de C es sobreescrito y termina con Error de segmento, colgandose el programa.



Saludos!
« Última modificación: 8 Septiembre 2016, 19:34 pm por AlbertoBSD » En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Duda con realloc
« Respuesta #5 en: 6 Septiembre 2016, 18:29 pm »

Para ver de forma más clara el tema trata realloc como si estuviera escrito de la siguiente manera:
Código
  1. void* realloc(void* __ptr, size_t __size) {
  2.    void* retval = (void*)malloc(__size);
  3.  
  4.    if(__ptr) {
  5.        memcpy(retval, __ptr, __size);
  6.        free(__ptr);
  7.    }
  8.  
  9.    return retval;
  10. }

realloc es mucho más elaborada pero su funcionamiento básico se puede representar de susodicha forma.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
API parecida a realloc
Ingeniería Inversa
.:UND3R:. 3 2,307 Último mensaje 6 Octubre 2011, 17:56 pm
por Иōҳ
problemas con parámetros realloc
Ingeniería Inversa
.:UND3R:. 1 2,039 Último mensaje 6 Octubre 2011, 06:02 am
por apuromafo CLS
Pequeña duda con "realloc" (SOLUCIONADO)
Programación C/C++
SARGE553413 6 3,340 Último mensaje 8 Agosto 2012, 22:09 pm
por SARGE553413
Problema con realloc - c
Programación C/C++
HRSLASH 5 2,937 Último mensaje 5 Noviembre 2012, 02:51 am
por HRSLASH
Problema con realloc :(
Programación C/C++
sherry_XD 4 2,297 Último mensaje 4 Julio 2014, 17:38 pm
por do-while
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines