Autor
|
Tema: Arreglo con memoria dinámica en lenguaje C. (Leído 5,305 veces)
|
NOB2014
Desconectado
Mensajes: 366
|
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.................: "); while((ch = getchar()) !='\n' && ch !=EOF ); printf("\n Quieres introducir otro valor? (S/N)...: "); 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 ]); 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.
|
|
|
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
Mensajes: 3.412
ASMático
|
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.
|
|
|
En línea
|
|
|
|
NOB2014
Desconectado
Mensajes: 366
|
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.
|
|
|
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
Mensajes: 93
|
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
Mensajes: 366
|
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
Mensajes: 366
|
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++; } return 0; }
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
Mensajes: 3.412
ASMático
|
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
Mensajes: 366
|
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.
|
|
|
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
Mensajes: 93
|
Donde esta el código que produce ese error?
|
|
|
En línea
|
|
|
|
AlbertoBSD
Programador y
Moderador Global
Desconectado
Mensajes: 3.705
🏴 Libertad!!!!!
|
Estas haciendo un Free de un valor no inicializado o previamente liberado.
Necesitamos el codigo.
Saludos.
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
arreglo de cadenas con memoria dinamica
Programación C/C++
|
wolftdark
|
2
|
2,277
|
7 Julio 2015, 03:30 am
por wolftdark
|
|
|
Lenguaje C:apuntador a arreglo de enteros y arreglo de apuntadores a enteros.
Programación C/C++
|
NOB2014
|
2
|
2,717
|
27 Noviembre 2015, 12:59 pm
por NOB2014
|
|
|
Concatenar cadenas con memoria dinámica en lenguaje C.
Programación C/C++
|
NOB2014
|
3
|
4,592
|
19 Junio 2016, 19:22 pm
por AlbertoBSD
|
|
|
Arreglo de apuntadores vs. arreglo común en lenguaje C.
Programación C/C++
|
NOB2014
|
1
|
3,327
|
1 Octubre 2016, 23:29 pm
por dato000
|
|
|
Arreglo de cadenas con memoria dinámica (realloc) lenguaje C.
Programación C/C++
|
NOB2014
|
9
|
7,339
|
4 Octubre 2016, 17:42 pm
por MAFUS
|
|