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

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema con realloc funciones y punteros a estructuras [RESUELTO]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema con realloc funciones y punteros a estructuras [RESUELTO]  (Leído 4,466 veces)
Xargam

Desconectado Desconectado

Mensajes: 27


Ver Perfil
Problema con realloc funciones y punteros a estructuras [RESUELTO]
« en: 2 Junio 2018, 06:26 am »

Hola gente estoy volviendome loco con  realloc.... Veo que corrompe datos.. Declare una estructura, luego cree un puntero dinamico a ella con malloc. El problema es que si yo paso el puntero a una funcion y en la funcion hago realloc del puntero los datos se corrompen.... por que???????????? Por que si uso realloc con un dato que no es de la funcion mi programa funciona mal¨???

Ejemplo:


Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4. #define MOVFILE "movies.bin"
  5.  
  6.  
  7. typedef struct
  8. {
  9.    char titulo[50];
  10.    int duracion;
  11.  
  12. } eMovie ;
  13.  
  14. int x(eMovie* movie);
  15. void y(eMovie* movie, int tam);
  16.  
  17. int main()
  18. {
  19.  
  20.    eMovie* movies = (eMovie*) malloc(sizeof(eMovie));
  21.    int index = x(movies);
  22.    index++;
  23.    y(movies,index);
  24.    free(movies);
  25.    return 0;
  26. }
  27.  
  28.  
  29. int x(eMovie* movie)
  30. {
  31.    int salir = 0;
  32.    int moves = 0;
  33.    while(salir != 27)
  34.    {
  35.        printf("\nTITULO: ");
  36.        scanf("%s", (movie + moves)->titulo);
  37.        printf("\nDURACION: ");
  38.        scanf("%d", &(movie + moves)->duracion);
  39.        printf("SALIR? esc:");
  40.        salir = getche();
  41.        if(salir != 27)
  42.        {
  43.            moves++;
  44.            movie =(eMovie*) realloc(movie,sizeof(eMovie)*(moves+1) );
  45.        }
  46.    }
  47.    free(movie);
  48.    return moves;
  49. }
  50.  
  51. void y(eMovie* movie, int tam)
  52. {
  53.    for(int i = 0; i < tam; i++)
  54.    {
  55.        printf("\n\nTITULO: %s\n", (movie + i)->titulo);
  56.        printf("DURACION: %d\n", (movie + i)->duracion);
  57.    }
  58. }
  59.  

Como ven el puntero a movie se pasa a una funcion y alli se hace el realloc pruebenlo, el string se cambia... Al imprimirse...


« Última modificación: 3 Junio 2018, 21:37 pm por Xargam » En línea

SrMcLister

Desconectado Desconectado

Mensajes: 35



Ver Perfil
Re: Problema con realloc funciones y punteros a estructuras
« Respuesta #1 en: 2 Junio 2018, 13:36 pm »

Buenas Xargam.
Para que se pueda probar tu código se necesita la estructura declarada, en general, todo el código en si.
Me gustaría ayudarte pero sin la estructura no va a poder ser.
Un Saludo.
PD: El código ponlo entre etiquetas de code, para que sea más legible ;D


En línea

Código
  1. return((u.areHappy() && u.knowIt()) ? u.clapYourHands() : u.goFuckYourself());
Xargam

Desconectado Desconectado

Mensajes: 27


Ver Perfil
Re: Problema con realloc funciones y punteros a estructuras [Actualizado]
« Respuesta #2 en: 2 Junio 2018, 14:18 pm »

Ya le agregue las etiquetas, el define no sirve, en realidad esto trbajaba con archivos y debido al problema que me genera realloc reduci el codigo para mostrarlo.
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Problema con realloc funciones y punteros a estructuras [Actualizado]
« Respuesta #3 en: 2 Junio 2018, 14:40 pm »

Línea 47. ¿Para qué liberas movie? Lo sigues necesitando una vez fuera de la función.
Línea 29. El argumento de x debería ser un puntero a puntero ya que realloc te puede reasignar la dirección del array dinámico. Si pasas solo el puntero éste será copiado, debido a que los argumentos se pasan por valor, y aunque se modifique cuándo salgas de la función no verás ese cambio.
En línea

srWhiteSkull


Desconectado Desconectado

Mensajes: 444



Ver Perfil WWW
Re: Problema con realloc funciones y punteros a estructuras [Actualizado]
« Respuesta #4 en: 2 Junio 2018, 15:51 pm »

Código
  1. ...
  2.  
  3. int main()
  4. {
  5.  
  6.    eMovie* movies = (eMovie*) malloc(sizeof(eMovie));
  7. ...
  8.  
Lo que hagas aquí, se queda ahí. Lo que vengo a decirte, como el caso de otro hilo similar y reciente, es que C no es C++, y la única forma que tienes para modificar el puntero es retornando el nuevo puntero en la función x o usando un puntero global.

Cuando pasas por referencia pasa eso precisamente, que pasas por referencia, y lo único que puedes hacer con eso es modificar el contenido existente en esa dirección, pero no puedes asignar otro puntero, porque lo que tienes en la función es una copia del puntero que usa la misma referencia que le pasas. Por eso, insisto, retorna el nuevo puntero.

Acostumbra a NO hacer eso :
Código
  1. ...
  2.        scanf("%s", (movie + moves)->titulo);
  3.        printf("\nDURACION: ");
  4.        scanf("%d", &(movie + moves)->duracion);
  5.        printf("SALIR? esc:");
  6. ...
  7.  
Usa variables y luego pásalo luego al objeto. Para pasar un char[] a otro char[] usa el memcpy(). Si tienes pensado usar movie como un array, que no sería lo adecuado, úsalo como un array, no uses aritmética de punteros de esa forma. Ejemplo:
Código
  1. ...
  2.        scanf("%s", movie[moves].titulo);
  3.        printf("\nDURACION: ");
  4.        scanf("%d", &duracion);
  5.        movie[moves].duracion=duracion;
  6.        printf("SALIR? esc:");
  7. ...
  8.  

Si vas a retornar el puntero para usarlo como te dije, no liberes el puntero antes de devolverlo (el free() ese dentro de la función x). Libera la memoria en el main o función principal.

Aquí lo mismo que te dije antes...
Código
  1. void y(eMovie* movie, int tam)
  2. {
  3.    for(int i = 0; i < tam; i++)
  4.    {
  5.        printf("\n\nTITULO: %s\n", (movie + i)->titulo);
  6.        printf("DURACION: %d\n", (movie + i)->duracion);
  7.    }
  8. }
  9.  
Usa un array.. ... verás más legible el código.
Código
  1.  
  2.   movie[i].titulo
  3.   movie[i].duracion
  4.  

Y si no, como antes le dije al otro, si quieren trabajar con punteros de forma más flexible y segura usen C++.
« Última modificación: 2 Junio 2018, 15:54 pm por srWhiteSkull » En línea

Xargam

Desconectado Desconectado

Mensajes: 27


Ver Perfil
Re: Problema con realloc funciones y punteros a estructuras [Actualizado]
« Respuesta #5 en: 3 Junio 2018, 06:44 am »

Línea 47. ¿Para qué liberas movie? Lo sigues necesitando una vez fuera de la función.
Línea 29. El argumento de x debería ser un puntero a puntero ya que realloc te puede reasignar la dirección del array dinámico. Si pasas solo el puntero éste será copiado, debido a que los argumentos se pasan por valor, y aunque se modifique cuándo salgas de la función no verás ese cambio.
Hola muchisimas gracias ppr tu respuesta,ya pude resolver el problema,pero quisiera saber mas acerca del por que no se puede  pasar solo el puntero. Osea si haces realloc reservas mas espacio en memoria,por que los datos deaaparecen??? Podrias ser mas especiico
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Problema con realloc funciones y punteros a estructuras [Actualizado]
« Respuesta #6 en: 3 Junio 2018, 08:21 am »

Realloc funciona más o menos de esta forma:
Primero asigna un trozo de memoria del tamaño que le indiques, después copia el contenido de de tu viejo puntero al nuevo, libera el viejo y devuelve el nuevo.

Y cómo el puntero cambia, el que no pases por referencia un puntero (un puntero a puntero) no verás los cambios que se han hecho y además tendrás un puntero suelto porque realloc te lo ha liberado.
« Última modificación: 3 Junio 2018, 08:25 am por MAFUS » En línea

srWhiteSkull


Desconectado Desconectado

Mensajes: 444



Ver Perfil WWW
Re: Problema con realloc funciones y punteros a estructuras [Actualizado]
« Respuesta #7 en: 3 Junio 2018, 19:33 pm »

Y cómo el puntero cambia, el que no pases por referencia un puntero (un puntero a puntero) no verás los cambios que se han hecho y además tendrás un puntero suelto porque realloc te lo ha liberado.
Buff gracias por recordármelo,

Claro, la otra opción Xargam es lo que comenta MAFUS, que en vez de retornar (con un return) el puntero o usar un puntero global, es usando el puntero a puntero, que es simplemente definir el puntero en el argumento de la función de x con dos asteriscos (**) y tratarlo en la función así (*movie)[moves] o así (*(*movie+moves)). Corrígeme MAFUS si me equivoco.
« Última modificación: 3 Junio 2018, 21:42 pm por srWhiteSkull » En línea

Xargam

Desconectado Desconectado

Mensajes: 27


Ver Perfil
Re: Problema con realloc funciones y punteros a estructuras [Actualizado]
« Respuesta #8 en: 3 Junio 2018, 21:36 pm »

Muchas gracias a todos !! tema resuelto!! Saludos!!!
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[C] Estructuras y punteros a funciones
Programación C/C++
Amadeo Magnus 1 6,299 Último mensaje 13 Octubre 2010, 15:05 pm
por Karman
Problema de Estructuras con Funciones « 1 2 »
Programación C/C++
diego-4 12 4,805 Último mensaje 10 Noviembre 2012, 18:46 pm
por diego-4
Estructuras anidadas, funciones y punteros
Programación C/C++
NathanD 9 10,823 Último mensaje 18 Marzo 2013, 08:56 am
por 85
Punteros a estructuras...???
Programación C/C++
Ja_90 4 2,657 Último mensaje 11 Noviembre 2014, 21:10 pm
por eferion
Problema con arreglos, estructuras y funciones
Programación C/C++
ody532 3 2,525 Último mensaje 21 Abril 2017, 10:43 am
por MAFUS
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines