Variable estática dentro de una función en C

¿Qué se imprimirá? 6 6 o 6 7? ¿Y por qué?

void foo() { static int x = 5; x++; printf("%d", x); } int main() { foo(); foo(); return 0; } 

Hay dos problemas aquí, duración y scope.

El scope de la variable es donde se puede ver el nombre de la variable. Aquí, x es visible solo dentro de la función foo ().

La duración de una variable es el período durante el cual existe. Si x se definió sin la palabra clave static, la duración sería desde la entrada en foo () hasta la devolución desde foo (); por lo que se reinicializaría a 5 en cada llamada.

La palabra clave estática actúa para extender la vida útil de una variable a la duración del progtwig; por ejemplo, la inicialización ocurre una sola vez y luego la variable conserva su valor, cualquiera que haya sido, sobre todas las futuras llamadas a foo ().

Salida : 6 7

Motivo : la variable estática se inicializa solo una vez (a diferencia de la variable automática) y se evitará una definición adicional de la variable estática durante el tiempo de ejecución. Y si no se inicializa manualmente, se inicializa con el valor 0 automáticamente. Asi que,

 void foo() { static int x = 5; // assigns value of 5 only once x++; printf("%d", x); } int main() { foo(); // x = 6 foo(); // x = 7 return 0; } 

Eso es lo mismo que tener el siguiente progtwig:

 static int x = 5; void foo() { x++; printf("%d", x); } int main() { foo(); foo(); return 0; } 

Todo lo que hace la palabra clave static en ese progtwig es que le dice al comstackdor (esencialmente) ‘hey, aquí tengo una variable a la que no quiero que nadie más acceda, no le digo a nadie que existe’.

Dentro de un método, la palabra clave estática le dice al comstackdor lo mismo que arriba, pero también, ‘no le digas a nadie que esto existe fuera de esta función, solo debería ser accesible dentro de esta función’.

espero que esto ayude

6 7

el comstackdor arregla que la inicialización de la variable estática no ocurre cada vez que se ingresa la función

Una variable estática dentro de una función tiene una vida útil mientras se ejecuta su progtwig. No se asignará cada vez que se llame y desasigne su función cuando regrese su función.

La salida será 6 7 . Una variable estática (ya sea dentro de una función o no) se inicializa exactamente una vez, antes de que se ejecute cualquier función en esa unidad de traducción. Después de eso, conserva su valor hasta que se modifique.

Vadiklk,

Por qué …? La razón es que la variable estática se inicializa solo una vez y mantiene su valor en todo el progtwig. significa que puede usar una variable estática entre las llamadas a funciones. también se puede usar para contar “cuántas veces se llama una función”

 main() { static int var = 5; printf("%d ",var--); if(var) main(); } 

y la respuesta es 5 4 3 2 1 y no 5 5 5 5 5 5 …. (ciclo infinito) como está esperando. de nuevo, razón por la cual la variable estática se inicializa una vez, cuando la próxima vez que se llame a main () no se inicialice a 5 porque ya se ha inicializado en el progtwig. Así que podemos cambiar el valor pero no reiniciarlo. Eso es cómo funciona la variable estática.

o puede considerar según el almacenamiento: las variables estáticas se almacenan en la Sección de datos de un progtwig y las variables que se almacenan en la Sección de datos se inicializan una vez. y antes de la inicialización se mantienen en la sección BSS.

A su vez, las variables Auto (locales) se almacenan en Stack y todas las variables en la stack se reinicializan todo el tiempo cuando se llama a la función, ya que se crea un nuevo FAR (registro de activación de funciones) para eso.

está bien para una mayor comprensión, haga el ejemplo anterior sin “estático” y le permitirá saber cuál será el resultado. Eso te hace entender la diferencia entre estos dos.

Gracias Javed

Leamos el artículo de Wikipedia sobre Variables estáticas …

Variables locales estáticas: las variables declaradas como estáticas dentro de una función se asignan estáticamente teniendo el mismo scope que las variables locales automáticas. Por lo tanto, cualquier valor que la función ponga en sus variables locales estáticas durante una llamada seguirá presente cuando se vuelva a llamar a la función.

Obtendrá 6 7 impreso como, como se prueba fácilmente, y este es el motivo: cuando se llama por primera vez a foo , la variable estática x se inicializa a 5. Luego se incrementa a 6 y se imprime.

Ahora para la próxima llamada a foo . El progtwig omite la inicialización de la variable estática y en su lugar utiliza el valor 6 que se asignó a x la última vez. La ejecución procede normalmente, dándole el valor 7.

 6 7 

x es una variable global que solo es visible desde foo (). 5 es su valor inicial, tal como se almacena en la sección de datos del código. Cualquier modificación posterior sobrescribe el valor anterior. No hay código de asignación generado en el cuerpo de la función.

6 y 7 Dado que la variable estática se inicializa solo una vez, entonces 5 ++ se convierte en 6 en la 1ª llamada 6 ++ se convierte en 7 en la 2ª llamada Nota: cuando se produce la 2ª convocatoria, toma x el valor es 6 en lugar de 5 porque x es una variable estática.

Salida: 6,7

Razón

La statement de x está dentro de foo pero la inicialización x=5 tiene lugar fuera de foo !

Lo que tenemos que entender aquí es que

 static int x = 5; 

no es lo mismo que

 static int x; x = 5; 

Otras respuestas han utilizado las palabras importantes aquí, scope y duración, y han señalado que el scope de x es desde el punto de su statement en la función foo hasta el final de la función foo . Por ejemplo, lo comprobé moviendo la statement al final de la función, y eso hace x no declarado en el x++; statement.

Entonces, la parte static int x (scope) de la statement realmente se aplica donde la lees, en algún lugar DENTRO de la función y solo desde allí en adelante, no encima de ella dentro de la función.

Sin embargo, la parte x = 5 (duración) del enunciado es la inicialización de la variable y que ocurre FUERA de la función como parte de la carga del progtwig. La variable x nace con un valor de 5 cuando se carga el progtwig.

Leí esto en uno de los comentarios: ” Además, esto no aborda la parte realmente confusa, que es el hecho de que el inicializador se omite en llamadas posteriores. ” Se omite en todas las llamadas. La inicialización de la variable está fuera del código de función propiamente dicho.

El valor de 5 se establece teóricamente independientemente de si se llama foo o no, aunque un comstackdor puede optimizar la función si no la llama a ninguna parte. El valor de 5 debe estar en la variable antes de llamar a foo.

Dentro de foo , la statement static int x = 5; es poco probable que genere ningún código en absoluto.

Encontré la dirección x utiliza cuando puse una función foo en un progtwig mío, y luego (correctamente) supuse que se usaría la misma ubicación si ejecutara el progtwig nuevamente. La captura de pantalla parcial a continuación muestra que x tiene el valor 5 incluso antes de la primera llamada a foo .

Break Point antes de la primera llamada a foo