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

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  duda con malloc
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: duda con malloc  (Leído 2,098 veces)
toshibb

Desconectado Desconectado

Mensajes: 1


Ver Perfil
duda con malloc
« 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


En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: duda con malloc
« Respuesta #1 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.


En línea

gitii

Desconectado Desconectado

Mensajes: 6


Ver Perfil
Re: duda con malloc
« Respuesta #2 en: 26 Abril 2018, 00:06 am »

Yo tambien estoy empezando con memoria dinamica... Cual seria el codigo correcto?
En línea

gitii

Desconectado Desconectado

Mensajes: 6


Ver Perfil
Re: duda con malloc
« Respuesta #3 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;
}
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: duda con malloc
« Respuesta #4 en: 26 Abril 2018, 00:50 am »

Muy bien.
En línea

gitii

Desconectado Desconectado

Mensajes: 6


Ver Perfil
Re: duda con malloc
« Respuesta #5 en: 26 Abril 2018, 00:52 am »

MAFUS lo dejarias asi o le harias algun cambio o alguna sugerencia? gracias
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: duda con malloc
« Respuesta #6 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.
En línea

gitii

Desconectado Desconectado

Mensajes: 6


Ver Perfil
Re: duda con malloc
« Respuesta #7 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
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Malloc ... « 1 2 »
Programación C/C++
roser24 14 6,797 Último mensaje 5 Mayo 2010, 21:15 pm
por Akai
Ayuda con el uso de malloc
Programación C/C++
alexis33de 2 3,834 Último mensaje 21 Agosto 2010, 23:18 pm
por alexis33de
Malloc y array ??
Programación C/C++
<<<-Basura->>> 2 3,199 Último mensaje 4 Octubre 2011, 15:19 pm
por LearningSpanishProgrammer
¿Duda sobre malloc en C?
Programación C/C++
D4P50N 2 2,114 Último mensaje 20 Noviembre 2012, 00:15 am
por D4P50N
Duda, problema de asignacion con Malloc
Programación C/C++
Fabi0lo 6 2,925 Último mensaje 25 Noviembre 2012, 18:31 pm
por 0xDani
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines