Autor
|
Tema: funcion que devuelve un puntero de una variable static (Leído 3,995 veces)
|
fafafa01
Desconectado
Mensajes: 82
|
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
Mensajes: 1.603
|
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
Mensajes: 3.412
ASMático
|
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
Mensajes: 1.603
|
Vale, pues entonces ahora mismo no entiendo qué es lo que se pretende.
A ver un ejemplo.
|
|
|
En línea
|
|
|
|
ivancea96
Desconectado
Mensajes: 3.412
ASMático
|
int* getArray(unsigned int size){ static int* array = nullptr; if(array != nullptr){ delee[] array; } array = new int[size]; return array; }
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: #include <ctime> #include <iostream> using namespace std; int random(int newSeed = -1){ static int seed = 4974654; if(newSeed != -1) seed = newSeed; else seed = (seed + 784513)%530789; return seed; } int main(){ random(time(0)); for(int i=0; i<10; i++) cout << random()%10 << endl; }
|
|
|
En línea
|
|
|
|
fafafa01
Desconectado
Mensajes: 82
|
que les parece este: //convierte de entero a una cadena de char recursivamente. static int i=1,c; if(n/10){ char *t; i++; return t; } else{ if(n<0){ static char s[i+1]; s[c++]='-'; s[c++]=-n+'0'; return s; } else{ static char s[i]; s[c++]=n+'0'; return s; } } }
|
|
« Última modificación: 24 Enero 2017, 21:52 pm por fafafa01 »
|
En línea
|
|
|
|
ivancea96
Desconectado
Mensajes: 3.412
ASMático
|
No inicializas c* Y bueno, static es útil pero, intenta no abusar xD 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
Mensajes: 82
|
tenes razon
|
|
|
En línea
|
|
|
|
MAFUS
Desconectado
Mensajes: 1.603
|
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. #include <stdio.h> #include <stdlib.h> #include <math.h> #include <limits.h> static char retval[12]; size_t size; int negativo = num < 0; unsigned n = (unsigned)abs(num ); size = (n ? log10(n ) : 0) + 1 + negativo ; if(negativo) retval[0] = '-'; retval[size--] = '\0'; do { retval[size--] = n%10 + '0'; n /= 10; } while(n); return retval; } int main() { }
|
|
« Última modificación: 25 Enero 2017, 01:53 am por MAFUS »
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
funcion que devuelve un caracter
Programación C/C++
|
mapers
|
5
|
3,473
|
16 Agosto 2010, 07:49 am
por leogtz
|
|
|
Ayuda con función que devuelve substring
Programación C/C++
|
Shon
|
0
|
2,547
|
19 Septiembre 2010, 20:06 pm
por Shon
|
|
|
Duda ejercicio java variable static
Java
|
beginner6
|
5
|
3,004
|
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
|
2,089
|
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,520
|
21 Enero 2017, 23:31 pm
por NOB2014
|
|