Hola, gente. -
Dejo aclarado que son mis inicios con memoria dinámica y puedo estar preguntando cualquier sandez, hay 2 cosas que me tienen intrigado:
#include <stdio.h>
#include <stdlib.h>
int main( void ){
float *V=NULL;
int N=0,i,ch;
char c;
do {
V=( float *)realloc((float *)V,(N+1)*sizeof(float));
printf("\n Ingresa un numero real.................: ");
scanf("%f", &V[N]);
while((ch = getchar()) !='\n' && ch!=EOF);
printf("\n Quieres introducir otro valor? (S/N)...: ");
c=getchar();
N++;
}while (c=='s' || c=='S');
for(i=0;i<N;i++)
printf("\n El valor %d es igual a..................: %f\n", i, V[i]);
free(V);
return 0;
}
V=( float *)realloc((float *)V,(N+1)*sizeof(float));
En los pocos ejemplos que vi no me parece que estuviera 2 veces en la misma línea el puntero (V) y la otra es ¿no se debería asignar primero con malloc y luego reasignar con calloc? (malloc fuera del bucle do while). -
Es todo, espero me ayuden a aclarar esto. -
Saludos.
Cita de: NOB2014 en 24 Mayo 2016, 19:45 PM
V=( float *)realloc((float *)V,(N+1)*sizeof(float));
En los pocos ejemplos que vi no me parece que estuviera 2 veces en la misma línea el puntero (V) y la otra es ¿no se debería asignar primero con malloc y luego reasignar con calloc? (malloc fuera del bucle do while).
2 veces en la misma línea. ¿Dices que por qué aparece en la misma línea la variable V?
Deja que aclare un poco el código (El (float*) en el primer parámetro es redundante. Estás convirtiendo un float* a float*. En todo caso, tendrías que convertirlo a void*, pero no es necesario):
V = (float*) realloc( V, (N+1)*sizeof(float) );
realloc retorna la nueva dirección de memoria, así que se la asignas al puntero.
No entendí muy bien la segunda pregunta; procedo con:
calloc es igual a malloc, solo que devuelve memoria inicializada toda a 0. No entiendo a qué te refieres con lo de malloc fuera del bucle while. Si realloc recibe un NULL como parámetro, hace lo mismo que malloc.
Hola.
La primer pregunta está clara, en cuanto a la segunda, creí que obligatoriamente se debería hacer algo como esto, pero parece que no es necesario. -
......................
V = (float *) malloc(N * sizeof(float));
do {
V = (float*) realloc( V, (N+1)*sizeof(float) );
.........................
Saludos y gracias.
Como ya mencionaron si pasas un puntero NULL y un tamaño distinto a cero a realloc se comporta como malloc es decir reserva memoria. El cast antes de malloc y realloc es innecesario el puntero void* es convertido automáticamente al tipo adecuado.
Hola, geeke, gracias por ocuparte.
Yo debería releer los mensajes, lo que decís de si pasas un puntero NULL y un tamaño distinto a cero a realloc se comporta como malloc (ya lo había dicho ivancea96) ahora que lo repetís me aclaro todo. -
Saludos.
Hola.
Estoy todavía un poco perdido y espero que no sea lo mismo que pregunte al principio. -
En la mayoría de los casos encuentro esta declaración para malloc
int *ptr = (int*)malloc(MAX * sizeof(int));
pero como lo encontré en otro Ej. también funciona, ¿no es necesario incluir...(int*)...?
#include <stdio.h>
#include <stdlib.h>
#define MAX 15
#define TABLA 3
int main( void ){
size_t i=1;
int *ptr = malloc(MAX * sizeof(int));
while( i<=MAX ){
ptr[i] = i*TABLA;
printf( "\n %2lu x %d = %2d", i, TABLA, ptr[i] );
i++;
}
free(ptr);
return 0;
}
Saludos.
En C, no es necesario. En C++, sí. Por esa razón, mi recomendación es ponerlo siempre. Pero esto ya es una opinión.
Gracias ivancea...
Con la práctica me surgió un error inesperado, por lo menos para mí, tengo claro que lo podría hacer con una sola variable y volcar el resultado en la misma en cada iteración, pero el caso es que estoy aprendiendo memoria dinámica y me encuentro con este inconveniente. -
(http://i68.tinypic.com/b3kdw5.jpg)
#define MAX 150
#define TABLA 5
Uds. me dirán.
Saludos.
Donde esta el código que produce ese error?
Estas haciendo un Free de un valor no inicializado o previamente liberado.
Necesitamos el codigo.
Saludos.
#include <stdio.h>
#include <stdlib.h>
#define MAX 150
#define TABLA 5
int main( void ){
size_t i=1;
int *ptr = (int*)malloc(MAX * sizeof(int));
while( i<=MAX ){
ptr[i] = i*TABLA;
printf( "\n %2lu x %d = %2d", i, TABLA, ptr[i] );
i++;
}
free(ptr);
return 0;
}
while( i <= MAX )
Estas accediendo fuera de los límites del array con <= cambialo por < o reservar size + 1
¿Es esta la manera correcta?, ya no me da error, estas en lo cierto.
int *ptr = (int*)malloc(MAX * sizeof(int)+1);
Esta parece mas correcta.-
int *ptr = (int*)malloc((MAX+1) * sizeof(int));
Saludos.
Muy bien por lo visto estas haciendo una "Tabla" de multiplicar.
Se puede abordar como lo solucionaste. Sin embargo en tu ejemplo queda sin utilizar el elemento 0 de tu arreglo.
Por ejemplo (Un remoto pero posible caso) si vas a guardar en archivo el arreglo
Usando
fwrite(ptr,sizeof(int),MAX,archivo);
Guardarias un ITEM basura (el primero) y omitirias el ultimo
Enonces mejor empezar en el elemento 0 y usar menor que en la comparacion en el while y adicional agregar + 1 en la multiplicación.
#include <stdio.h>
#include <stdlib.h>
#define MAX 150
#define TABLA 5
int main( void ){
size_t i=0;
int *ptr = (int*)malloc(MAX * sizeof(int));
while( i<MAX ){
ptr[i] = (i+1)*TABLA;
printf( "\n %2lu x %d = %2d", i+1, TABLA, ptr[i] );
i++;
}
free(ptr);
return 0;
}
Saludos.
Hola, Alberto. -
Gracias por tu tiempo, realmente te agradezco porque creí que nadie ya me iba a decir si era correcto o no mi solución (muchos en España estarán durmiendo 3:14 de la madrugada), funciona a la perfección y me ayudaste a entender un poco más los arreglos. -
Un abrazo.