elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Arreglo con memoria dinámica en lenguaje C.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Arreglo con memoria dinámica en lenguaje C.  (Leído 4,659 veces)
NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Arreglo con memoria dinámica en lenguaje C.
« en: 24 Mayo 2016, 19:45 pm »

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:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main( void ){
  5. float *V=NULL;
  6. int N=0,i,ch;
  7. char c;
  8.  
  9. do {
  10. V=( float *)realloc((float *)V,(N+1)*sizeof(float));
  11. printf("\n Ingresa un numero real.................: ");
  12. scanf("%f", &V[N]);
  13. while((ch = getchar()) !='\n' && ch!=EOF);
  14. printf("\n Quieres introducir otro valor? (S/N)...: ");
  15. c=getchar();
  16. N++;
  17. }while (c=='s' || c=='S');
  18.  
  19. for(i=0;i<N;i++)
  20. printf("\n El valor %d es igual a..................: %f\n", i, V[i]);
  21.  
  22. free(V);
  23.  
  24. return 0;
  25. }

Código
  1.     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.


En línea

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


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Arreglo con memoria dinámica en lenguaje C.
« Respuesta #1 en: 24 Mayo 2016, 20:06 pm »

Código
  1. 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):
Código
  1. 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.


En línea

NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Re: Arreglo con memoria dinámica en lenguaje C.
« Respuesta #2 en: 24 Mayo 2016, 20:46 pm »

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

 
Código
  1.       ......................
  2.        V =  (float *) malloc(N * sizeof(float));
  3. do {
  4. V = (float*) realloc( V, (N+1)*sizeof(float) );
  5.        .........................

Saludos y gracias.
En línea

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

Desconectado Desconectado

Mensajes: 93


Ver Perfil
Re: Arreglo con memoria dinámica en lenguaje C.
« Respuesta #3 en: 24 Mayo 2016, 21:05 pm »

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.
En línea

NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Re: Arreglo con memoria dinámica en lenguaje C.
« Respuesta #4 en: 24 Mayo 2016, 23:40 pm »

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.   
En línea

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


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Re: Arreglo con memoria dinámica en lenguaje C.
« Respuesta #5 en: 25 Mayo 2016, 19:55 pm »

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
Código
  1. int *ptr = (int*)malloc(MAX * sizeof(int));
pero como lo encontré en otro Ej. también funciona, ¿no es necesario incluir...(int*)...?

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define MAX 15
  5. #define TABLA 3
  6.  
  7. int main( void ){
  8. size_t i=1;
  9. int *ptr = malloc(MAX * sizeof(int));
  10.  
  11. while( i<=MAX ){
  12. ptr[i] = i*TABLA;
  13. printf( "\n %2lu x %d = %2d", i, TABLA, ptr[i] );
  14. i++;
  15. }
  16.  
  17. free(ptr);
  18.  
  19. return 0;
  20. }
  21.  
Saludos.
« Última modificación: 25 Mayo 2016, 19:58 pm por NOB2014 » En línea

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


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Arreglo con memoria dinámica en lenguaje C.
« Respuesta #6 en: 25 Mayo 2016, 20:27 pm »

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.
En línea

NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Re: Arreglo con memoria dinámica en lenguaje C.
« Respuesta #7 en: 25 Mayo 2016, 22:12 pm »

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



Código
  1. #define MAX 150
  2. #define TABLA 5
  3.  
Uds. me dirán.
Saludos.
En línea

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

Desconectado Desconectado

Mensajes: 93


Ver Perfil
Re: Arreglo con memoria dinámica en lenguaje C.
« Respuesta #8 en: 25 Mayo 2016, 22:48 pm »

Donde esta el código que produce ese error?
En línea

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Arreglo con memoria dinámica en lenguaje C.
« Respuesta #9 en: 25 Mayo 2016, 22:59 pm »

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

Necesitamos el codigo.

Saludos.
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines