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

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  funcion que devuelve un puntero de una variable static
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: funcion que devuelve un puntero de una variable static  (Leído 3,589 veces)
fafafa01

Desconectado Desconectado

Mensajes: 82


Ver Perfil
funcion que devuelve un puntero de una variable static
« en: 24 Enero 2017, 09:42 am »

Buenas, me surgió la duda si es posible realizar una función que devuelva un puntero con la dirección de memoria de una variable static definida dentro de la función. por ejemplo pasarle la dirección de un arreglo definido como static dentro de una función.
la idea de esa función, es que quien la usa no se deba preocupar por el largo del arreglo debido a que este se crearía en la misma función (dentro de un if{..} por ejemplo).


En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: funcion que devuelve un puntero de una variable static
« Respuesta #1 en: 24 Enero 2017, 10:08 am »

La idea del static es que el dato se mantenga de llamada a llamada pero solo sea accesible para esa función. Si sabes que debes usar ese dato fuera de la función hazlo global.


En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: funcion que devuelve un puntero de una variable static
« Respuesta #2 en: 24 Enero 2017, 20:21 pm »

La idea del static es que el dato se mantenga de llamada a llamada pero solo sea accesible para esa función. Si sabes que debes usar ese dato fuera de la función hazlo global.

Lo que comenta el fafafa01 también es posible, y se puede utilizar para evitar que el programador que utilice la función se preocupe por la memoria.
Por ejemplo, una variable static es una posible forma de hacer la función localtime de la librería time.h/ctime: http://www.cplusplus.com/reference/ctime/localtime/

A parte de static, otro especificador remarcable es thread_local, que funciona como static, solo que cada nuevo thread tendrá su propia variable.
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: funcion que devuelve un puntero de una variable static
« Respuesta #3 en: 24 Enero 2017, 20:49 pm »

Vale, pues entonces ahora mismo no entiendo qué es lo que se pretende.

A ver un ejemplo.
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: funcion que devuelve un puntero de una variable static
« Respuesta #4 en: 24 Enero 2017, 21:23 pm »

Código
  1. int* getArray(unsigned int size){
  2.    static int* array = nullptr;
  3.    if(array != nullptr){
  4.        delee[] array;
  5.    }
  6.  
  7.    array = new int[size];
  8.    return array;
  9. }

Por ejemplo, ahí tienes una función que te da un array de X tamaño de cuya memoria no tienes que preocuparte (es un ejemplo trivial y poco útil, pero es un ejemplo).

Otra posibilidad es almacenar un estado. Por ejemplo, un generador de números aleatorios:

Código
  1. #include <ctime>
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. int random(int newSeed = -1){
  7. static int seed = 4974654;
  8. if(newSeed != -1)
  9. seed = newSeed;
  10. else
  11. seed = (seed + 784513)%530789;
  12. return seed;
  13. }
  14.  
  15. int main(){
  16. random(time(0));
  17. for(int i=0; i<10; i++)
  18. cout << random()%10 << endl;
  19. }
En línea

fafafa01

Desconectado Desconectado

Mensajes: 82


Ver Perfil
Re: funcion que devuelve un puntero de una variable static
« Respuesta #5 en: 24 Enero 2017, 21:35 pm »

que les parece este:

Código
  1. //convierte de entero a una cadena de char recursivamente.
  2. char *itoa(int n){
  3. static int i=1,c;
  4. if(n/10){
  5. char *t;
  6. i++;
  7. t=itoa(n/10);
  8. t[c++]=abs(n%10)+'0';
  9. return t;
  10.  
  11. }
  12. else{
  13. if(n<0){
  14. static char s[i+1];
  15. s[c++]='-';
  16. s[c++]=-n+'0';
  17. return s;
  18. }
  19. else{
  20. static char s[i];
  21. s[c++]=n+'0';
  22. return s;
  23. }
  24. }
  25. }
  26.  
« Última modificación: 24 Enero 2017, 21:52 pm por fafafa01 » En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: funcion que devuelve un puntero de una variable static
« Respuesta #6 en: 24 Enero 2017, 21:52 pm »

No inicializas c*

Y bueno, static es útil pero, intenta no abusar xD
Código
  1. static char s[i];
Eso te va a generar un array de longitud i la primera vez que se llame a la función, y tendrá ese tamaño siempre.
Deberías suar memoria dinámica qsi quieres que sea dinámico.

Edito: Diría que la declaración static de ese array es ilegal, así que evítala. Punteros, memoria dinámica es la solución.
« Última modificación: 24 Enero 2017, 21:55 pm por ivancea96 » En línea

fafafa01

Desconectado Desconectado

Mensajes: 82


Ver Perfil
Re: funcion que devuelve un puntero de una variable static
« Respuesta #7 en: 24 Enero 2017, 21:53 pm »

tenes razon
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: funcion que devuelve un puntero de una variable static
« Respuesta #8 en: 24 Enero 2017, 23:28 pm »

Entiendo, aunque voy a decir que no es una técnica que me gusta mucho. Veo una fuga de memoria si el puntero es a un array dinámico y no se libera la memoria al final del programa (para sistemas donde el kernel no libere la memoria dinámica del programa cuándo este termine).


Edito:
Una solución es usando un array estático, así el programa limpia la memoria con normalidad. Por contra se debe pensar bien la cantidad de memoria a usar de antemano.


Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include <limits.h>
  5.  
  6.  
  7. char * itoa(int num) {
  8.    static char retval[12];
  9.    size_t size;
  10.    int negativo = num < 0;
  11.    unsigned n = (unsigned)abs(num);
  12.  
  13.    size = (n? log10(n) : 0) + 1 + negativo;
  14.  
  15.    if(negativo)
  16.        retval[0] = '-';
  17.  
  18.    retval[size--] = '\0';
  19.  
  20.    do {
  21.        retval[size--] = n%10 + '0';
  22.        n /= 10;
  23.    } while(n);
  24.  
  25.    return retval;
  26. }
  27.  
  28. int main() {
  29.    printf("%s\n", itoa(INT_MAX));
  30.    printf("%s\n", itoa(0));
  31.    printf("%s\n", itoa(INT_MIN));
  32. }
« Última modificación: 25 Enero 2017, 01:53 am por MAFUS » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
funcion que devuelve un caracter
Programación C/C++
mapers 5 3,101 Último mensaje 16 Agosto 2010, 07:49 am
por leogtz
Ayuda con función que devuelve substring
Programación C/C++
Shon 0 2,368 Último mensaje 19 Septiembre 2010, 20:06 pm
por Shon
Duda ejercicio java variable static
Java
beginner6 5 2,704 Último mensaje 11 Noviembre 2014, 18:09 pm
por beginner6
Cuando recorro un txt con un FOR la variable me devuelve el numero y no la palab
Scripting
mis4 0 1,873 Último mensaje 24 Noviembre 2016, 15:39 pm
por mis4
Si aprieto <enter> sin ningún ingreso fgets no me devuelve un puntero null en C.
Programación C/C++
NOB2014 4 2,197 Último mensaje 21 Enero 2017, 23:31 pm
por NOB2014
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines