Arreglo con memoria dinámica en lenguaje C.

Iniciado por NOB2014, 24 Mayo 2016, 19:45 PM

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

NOB2014

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.
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

ivancea96

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.

NOB2014

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.
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

geeke

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.

NOB2014

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.   
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

NOB2014

#5
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.
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

ivancea96

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.

NOB2014

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. -



#define MAX 150
#define TABLA 5

Uds. me dirán.
Saludos.
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

geeke

Donde esta el código que produce ese error?

AlbertoBSD

Estas haciendo un Free de un valor no inicializado o previamente  liberado.

Necesitamos el codigo.

Saludos.
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW