Foros del Web » Programación para mayores de 30 ;) » C/C++ »

problema realloc

Estas en el tema de problema realloc en el foro de C/C++ en Foros del Web. Hola. Tengo las siguientes funciones: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código C: Ver original int tam_infijo ( char * array ) {         int cont ...
  #1 (permalink)  
Antiguo 24/07/2011, 10:39
 
Fecha de Ingreso: marzo-2011
Mensajes: 94
Antigüedad: 13 años, 9 meses
Puntos: 3
problema realloc

Hola. Tengo las siguientes funciones:

Código C:
Ver original
  1. int tam_infijo (char * array){
  2.    
  3.     int cont = 0;
  4.    
  5.     while ( *( array + cont ) != '\0' ){
  6.          
  7.           cont++;
  8.          
  9.     }
  10.    
  11.     return cont - 1;
  12.    
  13. }
  14.  
  15. char * scan_infijo (){
  16.    
  17.     char * expresion;
  18.    
  19.     expresion = (char*) calloc (200, sizeof (char));
  20.    
  21.     fgets (expresion, 200, stdin);
  22.    
  23.     realloc (expresion, sizeof(char) * (tam_infijo (expresion) + 1) );
  24.    
  25.     puts (expresion);
  26.    
  27. }

Alguien me podría decir que estoy haciendo mal a la hora de llamar a realloc? esque al programa le da igual que escriba:

(tam_infijo (expresion) + 1) que (tam_infijo (expresion) - 2), hace lo mismo...

Tambien me estoy dando cuenta que malloc hace exactamente lo mismo. Da igual si pones (malloc (4)) que malloc (4*sizeof(char)) que lo que sea porque almacena todos los caracteres :S

Un saludo!
  #2 (permalink)  
Antiguo 24/07/2011, 12:19
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 22 años, 1 mes
Puntos: 52
Respuesta: problema realloc

No se exactamente por que usas realloc. En este caso calloc o malloc serian las indicadas.

Segun yo, realloc toma un puntero con memoria apartada y reubica la memoria con un tamaño diferente al del tamaño original.
calloc solo aparta memoria, y la limpia poniendo ceros.
malloc hace lo mismo sin limpiar.

Es decir:

calloc es lo mismo que

a=malloc(..)
memset(a, sizeof(a), 0);

Saludos
  #3 (permalink)  
Antiguo 24/07/2011, 17:46
 
Fecha de Ingreso: marzo-2011
Mensajes: 94
Antigüedad: 13 años, 9 meses
Puntos: 3
Respuesta: problema realloc

Hago calloc para tomar 200 ubicaciones de memoria tipo char para almacenar hasta 200 caracteres. Como normalmente se utilizan menos de 200 caracteres para el programa que estoy haciendo, pues utilizo realloc para almacenar menos de 200. Es decir pido 200 caracteres, como introduzco por ejemplo 5 los 195 restantes los libero con realloc.
  #4 (permalink)  
Antiguo 24/07/2011, 20:27
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 8 meses
Puntos: 228
Respuesta: problema realloc

Hoy en dia es lo mismo malloc (4) que malloc (sizeof(char) * 4). Porque en todos los compiladores el tamaño de un char es de un bytes. El problema esta si usas enteros u otros datos....

Volviendo al codigo tu problema esta en que nunca tomas el nuevo puntero que devuelve realloc. realloc te devuelve un puntero nuevo no modifica el que vos le pasas por argumento.

Asi deberia ser:

expresion = realloc (expresion, sizeof(char) * (tam_infijo (expresion) + 1) );
  #5 (permalink)  
Antiguo 25/07/2011, 06:50
 
Fecha de Ingreso: marzo-2011
Mensajes: 94
Antigüedad: 13 años, 9 meses
Puntos: 3
Respuesta: problema realloc

Hola sam90, gracias por contestar. Una pregunta, si no se modifica, de que sirve que se le pase como argumento??

Un saludo!
  #6 (permalink)  
Antiguo 25/07/2011, 11:07
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 8 meses
Puntos: 228
Respuesta: problema realloc

No te confundas. Se modifican los datos a donde apunta. El puntero como una variable no se modifica. Porque esta siendo pasada como valor y no como referencia.

Pasa lo mismo si vos queres modificar un entero. Si lo pasas como valor, por mas que modifique la variable, al volveer de la funcion seguira teniendo el mismo valor. Pero si lo pasas por referencia (osea el puntero de ese entero) si podes modificar el valor del entero. Pero NUNCA vas a poder hacer que ESE PUNTERO apunte a un nuevo entero.

Se entiende el punto de vista? Por eso tenes que capturar el valor de retorno del realloc que el nuevo puntero a a la memoria.

Etiquetas: caracteres, funcion, programa, realloc
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:33.