duda con malloc

Iniciado por toshibb, 25 Abril 2018, 17:18 PM

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

toshibb

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

int main(){

   int *pi;
   pi=malloc(sizeof(int));
   *pi=5;
   printf("%d\n",*pi);
   pi=5;
   printf("%d\n",pi);
   puts("");

   char *cadena;
   cadena=malloc(5*sizeof(char));
   cadena="hola";
   printf("%s\n",cadena);

   return 0;
}

Tengo una duda y es en el *pi=5 y pi=5 cual deberia usarse?
Porque funcionan los dos?
Se que con cadena si la intento desreferenciar se producira un error o sea que no podria hacer *cadena="hola" sin embargo con *pi=5 si puedo y no se produce error
Un saludo y gracias

MAFUS

int *pi;
pi=malloc(sizeof(int));
*pi=5;
printf("%d\n",*pi);

Muy bien. Un puntero en memoria dinámica para un entero.

pi=5;
Aquí pierdes sizeof(int) bytes de memoria dinámica para el resto del programa. Has perdido el puntero antes de liberarlo y ahora apunta a la dirección de memoria 5.
¿Por qué funciona el programa? Porqué un puntero es un caso especial de dato entero sin signo así que le puedes dar cualquier número de esta clase que quieras.

printf("%d\n",pi);
Funciona porque le pides a pi que te dé su contenido como entero y eso es 5. Si le pidieras que te diera el contenido a la que apunta su puntero con *pi el S.O. te lo prohibiría por estar fuera del marco de memoria del programa.

char *cadena;
cadena=malloc(5*sizeof(char));

Muy bien. Un puntero en memoria dinámica para un entero.

cadena="hola";
Acabas de perder 5*sizeof(char) bytes de memoria dinámica al hacer que cadena apunte  a otro sitio sin haber liberado la memoria anterior. Ahora cadena apunta a la zona de sólo lectura donde el programa ha guardado la cadena 'hola'. No has copia 'hola' a cadena si eso es lo que pretendías; has modificado el puntero.

gitii

Yo tambien estoy empezando con memoria dinamica... Cual seria el codigo correcto?

gitii

Me he atrevido a hacerlo creo que seria tal que asi:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main(){

    int *pi=malloc(sizeof(int));;
    *pi=5;
    printf("%d\n",*pi);
    free(pi);
    pi=NULL;

    char *cadena=malloc(5*sizeof(char));
    strcpy(cadena,"hola");
    printf("%s\n",cadena);
    free(cadena);
    cadena=NULL;

    return 0;
}

MAFUS


gitii

MAFUS lo dejarias asi o le harias algun cambio o alguna sugerencia? gracias

MAFUS

En código de producción debes comprobar que malloc no ha devuelto NULL, que es su comportamiento cuándo no encuentra memoria suficiente, y resolver esa novedad. Pero para lo demás, ok. Incluso puedes eliminar eso de llevar a NULL los punteros si no los vas a usar más, pero es buena práctica eso de marcarlos con NULL.

gitii

Codigo final:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main(){

int *pi=malloc(sizeof(int));
if(!pi){
puts("no se pudo asignar memoria dinamica");
exit(-1);
}
*pi=5;
printf("%d\n",*pi);
free(pi);
pi=NULL;

char *cadena=malloc(5);
if(!cadena){
puts("no se pudo asignar memoria dinamica");
exit(-1);
}
strcpy(cadena,"hola");
printf("%s\n",cadena);
free(cadena);
cadena=NULL;

return 0;
}

Ahora creo que ya esta correcto