Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: toshibb en 25 Abril 2018, 17:18 pm



Título: duda con malloc
Publicado por: toshibb en 25 Abril 2018, 17:18 pm
Código:
#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


Título: Re: duda con malloc
Publicado por: MAFUS en 25 Abril 2018, 17:39 pm
Código:
int *pi;
pi=malloc(sizeof(int));
*pi=5;
printf("%d\n",*pi);
Muy bien. Un puntero en memoria dinámica para un entero.

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

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

Código:
char *cadena;
cadena=malloc(5*sizeof(char));
Muy bien. Un puntero en memoria dinámica para un entero.

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


Título: Re: duda con malloc
Publicado por: gitii en 26 Abril 2018, 00:06 am
Yo tambien estoy empezando con memoria dinamica... Cual seria el codigo correcto?


Título: Re: duda con malloc
Publicado por: gitii en 26 Abril 2018, 00:41 am
Me he atrevido a hacerlo creo que seria tal que asi:
Código:
#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;
}


Título: Re: duda con malloc
Publicado por: MAFUS en 26 Abril 2018, 00:50 am
Muy bien.


Título: Re: duda con malloc
Publicado por: gitii en 26 Abril 2018, 00:52 am
MAFUS lo dejarias asi o le harias algun cambio o alguna sugerencia? gracias


Título: Re: duda con malloc
Publicado por: MAFUS en 26 Abril 2018, 00:56 am
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.


Título: Re: duda con malloc
Publicado por: gitii en 26 Abril 2018, 01:08 am
Codigo final:
Código:
#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