¿Dónde y cuándo se almacena e inicializa la estática global y estática local?

incluir

static int i = 10; int main() { static int i = 20; printf ( "i = %d\n", i ); return 0; } 

Hay dos variables estáticas, una en el scope global y otra en el scope de la función. El comstackdor no está lanzando el error de “definición múltiple”. ¿Podría, por favor, hacerme saber dónde están almacenadas las dos variables estáticas?

Las dos variables se almacenan por separado porque son distintas: el problema del comstackdor es asegurarse de que estén separadas.

Las dos variables se inicializan antes de que se inicie el progtwig: esto es C, no C ++, donde las reglas son ligeramente diferentes.

Dentro de main() como se muestra, no puede acceder a la variable global i (nuevamente, esto es C, no C ++).

El -Wshadow comstackdor de GCC -Wshadow le advertirá sobre el i local que está siguiendo el global.

Estas variables se denominan “símbolos” y, durante la comstackción de una tabla, se genera la “tabla de símbolos”. Esta tabla contiene el nombre, el tipo, el scope y el puntero de memoria para cada símbolo (esto es como el mínimo, generalmente tiene un montón de cosas más), y cada vez que se hace una referencia a un símbolo en un scope específico, se sustituye un índice en la tabla. Estos índices son únicos, por lo que es la combinación de nombre + ámbito.

Entonces, en resumen, los nombres de las variables son simplemente decoración, internamente el comstackdor trabaja con una tabla de símbolos e índices en ella. Las estadísticas se inicializan durante el inicio del progtwig mediante la iteración a través de una tabla de punteros y la colocación de los valores correctos.