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

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Estado de Variables de retorno
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Estado de Variables de retorno  (Leído 3,040 veces)
x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Estado de Variables de retorno
« en: 17 Enero 2012, 08:30 am »

Saludos a todos vengo con una duda, mirad este codigo:

Código:
int* a()
{
int x;
int* p;

x = 10;
p = &x;
return p;


}


int main()
{
int* y;
int z=20;

y = a();

y=&z;
// que pasa con el valor 10?
}

bien, ultimamente me estoy preocupando mucho sobre los recursos y como administran la memoria mis programas y tengo una duda que pasa
con la variable ( valor 10 ) despues de la asignarle un nuevo valor al puntero que la tenia? el compilador borra internamente? osea ese 10, ahora el compilador sabe que esta libre para asignar algo en ese espacio de memoria? o la variable queda perdida en ese espacio? y si es asi como se haria entonces en ese caso para evitar eso?
de ante mano gracias :)


En línea

Xandrete

Desconectado Desconectado

Mensajes: 210



Ver Perfil
Re: Estado de Variables de retorno
« Respuesta #1 en: 17 Enero 2012, 11:48 am »

Bueno, primero una cosa. Lo que pretendes hacer en a() no se hace así. Cuando declaras la variable x, su ámbito de visibilidad se limita a la función donde la declaras. Aun en el caso de que funcionara, no es la manera correcta de llevarlo a cabo.

Para hacer algo como lo que quieres hacer, se utiliza:

Código
  1. int* p = new int; // si estas en C++
Código
  1. int *p = malloc(sizeof(int)); /* Si estas en C*/

Por lo demás, ¿qué pasa con el valor 10? No pasa absolutamente nada. Se queda por ahí, en algún lugar de la memoria, solo y abandonado sin que nadie pueda acceder a él Y_Y. ¿No te da penita? No se puede liberar la memoria ocupada por el 10 hasta que finalice el programa.

En fin, cuando ya no necesites más la memoria reservada, haces:

Código
  1. delete p;
Código
  1. free(p);

Se puede implementar un recolector de basura automático, como en Python. Aquí hay un ejemplo.


En línea

x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: Estado de Variables de retorno
« Respuesta #2 en: 20 Enero 2012, 04:50 am »

bien! gracias entonces pero y?
declarar todas las variables como globales ? :P
digamos quiero retornar un puntero a char pero el valor lo obtengo dentro de la funcion...
En línea

Uknow

Desconectado Desconectado

Mensajes: 24


Ver Perfil
Re: Estado de Variables de retorno
« Respuesta #3 en: 20 Enero 2012, 05:13 am »

bien! gracias entonces pero y?
declarar todas las variables como globales ? :P
digamos quiero retornar un puntero a char pero el valor lo obtengo dentro de la funcion...
se hace de la misma manera. debes devolver la direccion del puntero.

Bueno, primero una cosa. Lo que pretendes hacer en a() no se hace así. Cuando declaras la variable x, su ámbito de visibilidad se limita a la función donde la declaras. Aun en el caso de que funcionara, no es la manera correcta de llevarlo a cabo.

Para hacer algo como lo que quieres hacer, se utiliza:

Código
  1. int* p = new int; // si estas en C++
Código
  1. int *p = malloc(sizeof(int)); /* Si estas en C*/

Por lo demás, ¿qué pasa con el valor 10? No pasa absolutamente nada. Se queda por ahí, en algún lugar de la memoria, solo y abandonado sin que nadie pueda acceder a él Y_Y. ¿No te da penita? No se puede liberar la memoria ocupada por el 10 hasta que finalice el programa.

En fin, cuando ya no necesites más la memoria reservada, haces:

Código
  1. delete p;
Código
  1. free(p);

Se puede implementar un recolector de basura automático, como en Python. Aquí hay un ejemplo.
en este caso, a mi me parece que utilizar memoria dinamica es irrelevante. No es necesario.

Saludos.
En línea

x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: Estado de Variables de retorno
« Respuesta #4 en: 20 Enero 2012, 06:59 am »

puesi, pero si devuelvo un puntero el puntero se estaria declarando dentro de la funcion, viene siendo lo mismo que yo puse
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Estado de Variables de retorno
« Respuesta #5 en: 20 Enero 2012, 14:00 pm »

En mi opinión con solo la información que dio Xandrete ya debería estar solucionado el tema, a menos que busques algo mas y (en buen plan) no estés explicando de forma clara y precisa el problema.

Recopilando y extendiendo un poco:

* Puedes devolver la dirección en memoria de una variable local pero su uso (vía indirección) no sera valido ya que esas variables tienen el tipo de almacenamiento automático: se crean al inicio del bloque y se destruyen al finalizar este.

* Como indicas para solucionar esto puedes utilizar una variable "global" ya que su tipo de almacenamiento es estático: a partir de su definición la variable se crea y solo se destruye al finalizar el programa.

* Una mejor opción es seguir la recomendación de Xandrete: dependiendo del lenguaje utilizar malloc+free o new+delete ya que el objeto apuntado (como en el caso de las variables "globales") tiene el tipo de almacenamiento estático.

Un saludo
En línea

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
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
problema con el retorno del rey
Juegos y Consolas
dakaiz 3 2,877 Último mensaje 4 Enero 2004, 02:35 am
por dakaiz
Pasar variables por formulario sin variables globales¿? « 1 2 »
PHP
hardkoo 11 9,756 Último mensaje 22 Noviembre 2006, 12:55 pm
por chicuela66
Variables dentro de variables (batch)
Scripting
MK-Ultra 8 7,909 Último mensaje 6 Febrero 2008, 23:18 pm
por GUN$
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines