Preguntas sobre el lenguaje C
- Vortigano
- Posts: 255
- Joined: Sun May 07, 2017 6:04 am
Re: Preguntas sobre el lenguaje C
Gracias por tus palabras, dicen que explicar es aprender dos veces, aunque no te aferres a lo que te explico yo también estoy aprendiendo "errare humanum est", y recordá siempre la frase "No hay cuchara" jejejej.
Básicamente vas a liberar la memoria que no sea liberada de forma automática. Un puntero puede ser almacenado en stack, así que el puntero se libera automático, más no así la dirección a la que esté apuntando, que pudiera ser tanto una dirección que también está en el stack o que se encuentra en heap. Si se encuentra en heap deberás liberarla con free() pero solo a la dirección que apunta este puntero.
En tu caso si pasas variables que son de stack simplemente podés pasar la dirección de esa variable, y atraparlas desde la función llamada con un puntero de stack también... así que nada de uso de free() ni malloc() en este caso particular y la máquina estará encantada de ejecutar tu programa igualmente.
Básicamente vas a liberar la memoria que no sea liberada de forma automática. Un puntero puede ser almacenado en stack, así que el puntero se libera automático, más no así la dirección a la que esté apuntando, que pudiera ser tanto una dirección que también está en el stack o que se encuentra en heap. Si se encuentra en heap deberás liberarla con free() pero solo a la dirección que apunta este puntero.
En tu caso si pasas variables que son de stack simplemente podés pasar la dirección de esa variable, y atraparlas desde la función llamada con un puntero de stack también... así que nada de uso de free() ni malloc() en este caso particular y la máquina estará encantada de ejecutar tu programa igualmente.
- Hokuto7
- Posts: 1408
- Joined: Mon Aug 28, 2017 10:14 am
Re: Preguntas sobre el lenguaje C
Gracias por la ayuda Vortigano. 
- Vortigano
- Posts: 255
- Joined: Sun May 07, 2017 6:04 am
Re: Preguntas sobre el lenguaje C
De nada, si tenés progresos o experimentos que mostrar me contás. Saludos.
- Hokuto7
- Posts: 1408
- Joined: Mon Aug 28, 2017 10:14 am
Re: Preguntas sobre el lenguaje C
Hola,aqui estamos con otra preguntita.
Estoy intentando crear un constructor para iniciar variables pero no consigo nada,pongo codigo orientativo y comento.
El codigo esta a medio hacer porque he intentado varias cosas pero nada,lo que quiero es inicializar las variables de la estructura en la funcion y que me devuelva la estructura,para que cuando llame a la funcion iniciar en el main pueda guardarla en una variable y utilizarla,tampoco se muy bien que tipo de variable utilizar para guardar el valor devuelto de la funcion.
Estoy intentando crear un constructor para iniciar variables pero no consigo nada,pongo codigo orientativo y comento.
Code: Select all
typedef struct Jugador{
int x,y,velocidad;
Color color;
}Jugador;
Jugador *iniciar_jugador(){
Jugador *jugador;
jugador->x = 280;
jugador->y = 380;
jugador->velocidad = 5;
jugador->color = WHITE;
return jugador;
}
- CicTec
- Posts: 16590
- Joined: Thu Jul 31, 2008 10:18 pm
Re: Preguntas sobre el lenguaje C
Hola Hokuto7,
Asi no puede funcionar porque estas indicando a la funcion de devolver un puntero o sea un address de una zona de memoria, por ende debes alocar esta zona de memoria y luego devolverla, o si no se puede devolver NULL, seria asi:
[Codebox=gemix file=Untitled.gemix]
Jugador *iniciar_jugador(){
Jugador *jugador = NULL; // se inicializa el puntero a null por seguridad
jugador = (Jugador *)malloc(sizeof(Jugador));
if(jugador != NULL) {
jugador->x = 280;
jugador->y = 380;
jugador->velocidad = 5;
jugador->color = WHITE;
}
return jugador;
}
[/Codebox]
Con este codigo si malloc tiene exito (averiguando con IF, se inicializa la memoria, sino nada y return puede devolver el address en judador de la memoria alocada o NULL si no pudo allocar.
Luego no olvidar de dealocar este bloque de memoria en otro lado, sino habra memory leak en el programa.
Asi no puede funcionar porque estas indicando a la funcion de devolver un puntero o sea un address de una zona de memoria, por ende debes alocar esta zona de memoria y luego devolverla, o si no se puede devolver NULL, seria asi:
[Codebox=gemix file=Untitled.gemix]
Jugador *iniciar_jugador(){
Jugador *jugador = NULL; // se inicializa el puntero a null por seguridad
jugador = (Jugador *)malloc(sizeof(Jugador));
if(jugador != NULL) {
jugador->x = 280;
jugador->y = 380;
jugador->velocidad = 5;
jugador->color = WHITE;
}
return jugador;
}
[/Codebox]
Con este codigo si malloc tiene exito (averiguando con IF, se inicializa la memoria, sino nada y return puede devolver el address en judador de la memoria alocada o NULL si no pudo allocar.
Luego no olvidar de dealocar este bloque de memoria en otro lado, sino habra memory leak en el programa.
- Hokuto7
- Posts: 1408
- Joined: Mon Aug 28, 2017 10:14 am
Re: Preguntas sobre el lenguaje C
La verdad es que el puntero que señala a la funcion se lo puse porque si no no funcionaba y no se porque.
Como le estas asignando memoria a la estructura jugador donde exactamente lo libero,porque esta funcion es parte del archivo jugador,luego tengo que llamarla en el main,la libero en la misma funcion o donde.
Como le estas asignando memoria a la estructura jugador donde exactamente lo libero,porque esta funcion es parte del archivo jugador,luego tengo que llamarla en el main,la libero en la misma funcion o donde.
- CicTec
- Posts: 16590
- Joined: Thu Jul 31, 2008 10:18 pm
Re: Preguntas sobre el lenguaje C
Si la funcion te debe devolver un puntero, no puedes libearla en la misma funcion, sino el puntero se invalida y al usarlo generara crash por violacion de acceso de memoria no autorizado, debes estructurar el programa de forma que en algun lugar donde no te sirva mas, lo vas a dealocar, depende como quieres estructurar tu programa.
- Hokuto7
- Posts: 1408
- Joined: Mon Aug 28, 2017 10:14 am
Re: Preguntas sobre el lenguaje C
Una preguntita mas.
Pongo ejemplo y comento.
Pues aqui tengo un ejemplo parecido al otro,donde en un archivo creo la estructura jugador y la funcion iniciar y le paso por parametro la estructura para manipular sus propiedades.Luego tengo el archivo donde esta el main y ahi creo una variable de la estructura y se la paso por referencia a la funcion iniciar.
Me gustaria saber si esta forma de hacerlo es correcta o mejor seria reservar memoria para la variable de la estructura.
Pongo ejemplo y comento.
Code: Select all
typedef struct Jugador{
int x,y,velocidad;
Color color;
}Jugador;
void iniciar_jugador(Jugador *jugador){
jugador->x = 280;
jugador->y = 380;
jugador->velocidad = 5;
jugador->color = WHITE;
}
Code: Select all
int main(){
Jugador jugador;
iniciar_jugador(&jugador);
return 0;
}
Me gustaria saber si esta forma de hacerlo es correcta o mejor seria reservar memoria para la variable de la estructura.
Code: Select all
int main(){
Jugador *jugador = (Jugador*)malloc(sizeof(Jugador));
iniciar_jugador(jugador);
free(jugador);
return 0;
}
- CicTec
- Posts: 16590
- Joined: Thu Jul 31, 2008 10:18 pm
Re: Preguntas sobre el lenguaje C
Son ambas correctas, en el primer caso estas reservando memoria estatica, en el segundo memoria dinamica, obviamente en el segundo hay mas codigo de escribir, asi que en este pequeno ejemplo mejor la primera forma, pero en la gran mayoria de los casos (programas mas grandes o muy grandes) donde se necesita forzadamente memoria dinamica y hay que usar el segundo metodo, esto depende de las necesidades de tu programa.
- Hokuto7
- Posts: 1408
- Joined: Mon Aug 28, 2017 10:14 am
Re: Preguntas sobre el lenguaje C
Gracias por la ayuda. 