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.
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
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.
¡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!
Ok gracias por la respuesta, lo intentaré así. :D
Para marcar errores tienen el buffer de salida stderr no usen el stdout.
Dulces Lunas!¡.
Genial ya funciona muchas gracias por las respuestas, y gracias por el apunte del "stderr", lo he utilizado con fprintf.
Saludos.