Pequeña duda con "realloc" (SOLUCIONADO)

Iniciado por SARGE553413, 7 Agosto 2012, 19:51 PM

0 Miembros y 1 Visitante están viendo este tema.

SARGE553413

Hola a todos, tengo un problema con la función realloc.

El problema es que al redimensionar un vector de tamaño 3 o más con esta función, los datos que tenía en las componentes 0 y 1 pierden su valor y se convierten en numeros aleatorios raros.

(no estoy seguro de si el problema está en hacer el vector de tamaño>2, o el problema es usar repetidas veces esta función, porque la tengo dentro de un "while")

He probado escribiendolo así:(siendo c el puntero a vector y n un número entero cualquiera).

realloc(c,n*sizeof(int));
(int *) realloc(c,n*sizeof(int));
realloc((int *)  c,n*sizeof(int));

Ninguna de estas formas funciona.
¿Me ayuda alguien por favor?Muchas Gracias.

durasno

Hola! es raro que no te funcione, cualquiera de las 3 formas deberia andar. Seguro estas cometiendo otro error, subi todo el codigo


Saludos

PD: al redimensionar un vector, si este ya tiene datos, no deberia perderse dichos datos
Ahorrate una pregunta, lee el man

SARGE553413

Ok, ahí val el código: (está en C a pelo, no C++)

/*********************************
*********************************/
void mini_aleatorio(int **f,int **c,int *tam,int *fila,int *columna)
{
   const int MAX=4;
   int i;
   i=0;
   *fila=rand() % MAX;
   *columna=rand() % MAX;
   while(i<*tam)
   {
       if(((*f)==*fila)&&((*c)==*columna))
       {
           *fila=rand() % MAX;
           *columna=rand() % MAX;
           i=-1;
       }
       i++;
       
   }
   *tam=(*tam)+1;
   realloc((int *) (*f),(*tam)*sizeof(int));
   realloc((int *) (*c),(*tam)*sizeof(int));
   (*f)[(*tam)-1]=*fila;
   (*c)[(*tam)-1]=*columna;
}

bueno ese algoritmo es llamado por otro mas grande, no creo que tenga importancia, lo importante es saber que este algoritmo está metido en un while, por tanto será llamado varias veces.

Gracias de antemano.

do-while

¡Buenas!

Realloc devuelve un puentero al nuevo espacio de memoria asignado, que no tiene porque empezar en la misma posicion de memoria que el puntero original. Si no pudiese reasignar la memoria devolvera NULL y mantendra el puntero original intacto. Por lo tanto tendras que comprobar (como siempre) que la asignacion se ha hecho correctamente:



int *ptro,*aux;

if(!(ptro = malloc(10 * sizeof(int))))
   printf("Error");
else
{
   if(!(aux = realloc(ptro,20 * sizeof(int)))) //nos aseguramos de que se reasigna la memoria
       printf("Error");
   else
       ptro = aux; //y asignamos al puntero anterior la nueva direccion de memoria
}


¡Saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

SARGE553413

Ok gracias por la respuesta, lo intentaré así. :D

BlackZeroX

Para marcar errores tienen el buffer de salida stderr no usen el stdout.

Dulces Lunas!¡.
The Dark Shadow is my passion.

SARGE553413

Genial ya funciona muchas gracias por las respuestas, y gracias por el apunte del "stderr", lo he utilizado con fprintf.

Saludos.