Existe cierta confusión, ya que static
en C puede significar dos cosas diferentes. Uno es la duración del almacenamiento estático, y el otro es el enlace interno. static
utilizado como palabra clave en el alcance del archivo dará la función u objeto que se utiliza con el enlace interno.
La vinculación interna para una función u objeto significa que si declara otra función en otro "archivo" (esto no se llama realmente "archivo", sino unidad de traducción - TU), esa declaración se referirá a Función: el nombre declarado en esa unidad se "vinculará" a una entidad diferente del nombre declarado en esa otra unidad de traducción, que era "interna" a esa TU. Lo mismo se aplica a los objetos.
Independientemente de que se declare o no una variable de ámbito de archivo con static
, aún tendrá una duración de almacenamiento estático: eso significa que se almacena en todo el programa y muere cuando finaliza el programa. Otro ejemplo de un objeto que tiene una duración de almacenamiento estática es un literal de cadena. No se especifican los objetos que tienen una duración de almacenamiento estático, pero generalmente se almacenan según se inicialicen o no: las variables de ámbito de archivo inicializadas generalmente se almacenan en una sección llamada ".data", mientras que el archivo no inicializado Las variables de ámbito generalmente se almacenan en una sección llamada ".bss". Recuerde que si la variable no se inicializa, se inicializará en cero al inicio del programa: la sección ".bss" generalmente no se inicializa en cero por una implementación al iniciar el programa.
Dije "habitualmente" en todas partes, ya que no se especifica dónde se almacenan las cosas. Por ejemplo, algunas implementaciones podrían almacenar literales de cadenas en una sección de solo lectura. Y si tiene un puntero de archivo-alcance y no se inicializa, la aplicación inicializa para un nulo-puntero, que no es necesariamente un objeto con todos los bytes nulos :)
¡Esta respuesta parece ser complicada de entender! –