dudas sobre memoria dinamica.

Iniciado por Drewermerc, 1 Mayo 2014, 03:42 AM

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

Drewermerc


hola a todos.

bueno tengo unas dudas bueno pues yo no sabia que que realloc se podia usar solo y bueno queria saber si ese metodo es igual de efectivo que usar malloc y realloc juntos.


    #include <stdio.h>
    #include <stdlib.h>

    int main(){
    int *lista= NULL, num, i;

    do
    {
        i++;
        lista =realloc(lista,(i)*sizeof(int));
        printf("\nElemento ");
        scanf ("%d", &*(lista+i));
        printf("%d\n", lista);
        puts("presiona uno para continuar 0 para salir");
        scanf("%d", &num);
     } while (num == 1);

        free(lista);
        return 0;
    }

y tambien queria saber por que si guardo datos usando scanf al imprimir los valores me resultados erroneos asi.(aclaro esto es solo cuando se usa realloc solo.)


Elemento 5
154512
presiona uno para continuar 0 para salir



veo que la mayoria usa


    //aceder a los datos
        *(lista+i-1) = 5;
    //guardar datos con scanf
        &*(lista)



este tipo para acceder a datos de la memoria o guardar datos en ella yo por regular uso mas este metodo.


    lista[i+1];
    &lista[i];


que funciona igual, nose si algun metodo es es el correcto o los dos son corecto y es como cada quien se acomode a programar.
tambien queria saber cual es la diferencia entre esto:



    //si en un programa pongo esto da error al llegar a los 6 registros
    realloc(lista,i+1*sizeof(int));
    //pero si lo pongo asi ya no tengo el error
    realloc(lista,(i+1)*sizeof(int));
     
    //codigo completo
     
        #include <stdio.h>
        #include <stdlib.h>
         
        main()
        {
        int *lista,i=0,r;
        puts("Lista enlazada");
         
        lista=(int *) malloc(sizeof(int));
         
        printf("\nElemento %d de la lista enlazada y preciona 1 para agrgar otro elmento",i+1);
        scanf("%d",&*(lista));
                scanf("%d",&r);
                    while(r==1)
                    {
                        i++;
                        realloc(lista,i+1*sizeof(int));
                        scanf("%d",&*(lista+i));
                        puts("Desea agregar otro elemento");
                        scanf("%d",&r);
                       
                    }
           
            for(int x=0;x<i+1;x++)
            {
            printf("%d ",lista[x]);
           
            }
           
            free(lista);
        }




la verdad yo pense que la memoria dinamica no tenia mcuho uso pero ahora veo que te ayuda a manejar mucho mejor la memoria.
con lo que me surge otra duda si se puede trabar la memoria dinamica y manejar como matrizes, arrays unidimencionales etc. entonces cual seriamas conveniente usar memoria dinamica o las otras opciones o depende del programa que se desallorre.
bueno espero que me puedan ayudar.
saludos a todo.

rir3760

Cita de: Drewermerc en  1 Mayo 2014, 03:42 AMyo no sabia que que realloc se podia usar solo y bueno queria saber si ese metodo es igual de efectivo que usar malloc y realloc juntos.
Una llamada a realloc con su primer argumento igual a NULL tiene el mismo efecto que llamar a malloc:
char *p;

p = realloc(NULL, 100); /* Equivalente a "p = malloc(100);" */


Cita de: Drewermerc en  1 Mayo 2014, 03:42 AMtambien queria saber por que si guardo datos usando scanf al imprimir los valores me resultados erroneos asi.(aclaro esto es solo cuando se usa realloc solo.)
Elemento 5
154512
presiona uno para continuar 0 para salir
Porque estas imprimiendo la dirección del bloque, si se trata de eso debes utilizar el especificador "%p" y convertir explícitamente la dirección al tipo "void *":
printf("%p\n", (void *) lista);

O si se trata de imprimir los valores almacenados en el bloque debes utilizar un bucle, por ejemplo:
{
   int j;
   
   for (j = 0; j < i; j++)
      printf("%d\n", lista[j]);
}


Cita de: Drewermerc en  1 Mayo 2014, 03:42 AMveo que la mayoria usa
//aceder a los datos
*(lista+i-1) = 5;
//guardar datos con scanf
&*(lista)
No tiene caso utilizar "&*(lista)" ya que el efecto de los operadores se cancela, en otras palabras en lugar de "&*(lista)" basta con utilizar "lista".

Cita de: Drewermerc en  1 Mayo 2014, 03:42 AM//si en un programa pongo esto da error al llegar a los 6 registros
realloc(lista,i+1*sizeof(int));
No funciona porque el operador "*" tiene mayor prioridad que "+" y por ello la expresión se evalúa asi:
i + (1 * sizeof(int))

Cita de: Drewermerc en  1 Mayo 2014, 03:42 AMcual seriamas conveniente usar memoria dinamica o las otras opciones o depende del programa que se desallorre.
Depende del programa.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

Drewermerc

#2
hola rir3760.
bueno muchas gracias por contestar, ahora si ya me quedo mas claro todo.  :D