2011-01-18 18 views
5

No se puede acceder a las variables estáticas cuando se declaran en un archivo desde fuera del archivo. Pero si declaramos una variable estática dentro de un archivo y un puntero global y luego asignamos la dirección de la variable estática al puntero y luego exterminamos el puntero, se puede acceder a él.variables estáticas en c

¿Es correcto decir que no se puede acceder directamente a las variables estáticas, pero se puede acceder a ellas indirectamente utilizando punteros globales y luego externing?

+1

La pregunta debe estar en stackoverflow ya que se trata de la programación – Mark

+0

+1 para esta pregunta.Nunca lo pensé :) – hari

+2

Ni siquiera necesitas un puntero 'externo' para "acceder" a la variable. Un puntero a la variable también puede devolverse desde una función, o asignarse a un puntero a puntero desreferenciado. – aschepler

Respuesta

1

Se puede acceder a cualquier cosa dentro de un proceso si tiene un puntero, salvo los mecanismos específicos de la arquitectura para restringir el acceso. Ser redundante decir que una variable puede accederse a través de un puntero es redundante.

10

No es correcto decir que las variables estáticas "no se puede acceder" desde el exterior. Ser declarado static no tiene absolutamente nada que ver con la posibilidad del acceso externo.

Cuando se declara alguna entidad static, solo significa que esta entidad no se asociará con otras entidades del mismo nombre en otras unidades de traducción.

Por ejemplo, cuando se declara dos extern nombres de las variables a en diferentes unidades de traducción, estas variables son en realidad la misma, sola variable. Cuando declara dos variables static llamadas a en diferentes unidades de traducción, estas variables son dos variables independientes diferentes. Esto es lo que static hace en C. Nada más.

Hablando en términos más cotidianos, no es posible enlace a variables estáticas desde el exterior, es decir, no es posible pedir enlazador para hacernos acceder a la variable estática por su nombre desde el exterior. Sin embargo, siempre es posible acceder a él de alguna otra manera, como a través de un puntero, suponiendo que haya logrado obtener ese puntero de alguna manera.

+0

Nada más ... excepto inicializar la variable a 0. +1 no obstante – SiegeX

+3

@SiegeX: Todos los objetos con * duración de almacenamiento estático * se inicializan a 0. Pero para tener una duración de almacenamiento estático, el objeto no tiene que declararse necesariamente 'estático'. En otras palabras, la inicialización 0 no es inmediatamente relevante para la palabra clave 'static'. La inicialización 0 es una consecuencia de * duración de almacenamiento * específica. La pregunta (la forma en que la veo) es realmente acerca de * linkage *. – AnT

0

No se puede acceder a la variable y no habrá ningún nombre que coincida con este nombre de variable y nadie podrá encontrar el símbolo de esta variable.

Pero, por supuesto, siempre se puede acceder mediante un puntero. Se puede acceder a la memoria completa (pila + montón) del proceso a través de punteros y no hay forma de evitarlo.

Usar la variable estática no es una seguridad para evitar el acceso desde fuera de un módulo.

2

La palabra clave estática en 'C' solo restringe el alcance de la variable a esa unidad de traducción específica (es decir, ese archivo 'C'). En otras palabras, restringe el enlace de esa variable.y nada más.y En C se puede acceder a todas las variables estáticas, globales y automáticas a través de punteros durante su vida útil. No hay forma de prevenir eso.

6

Piense en nombres variables de enlaces estáticos y externos como direcciones como "maddy's house" y "123 foo street", respectivamente. El primero solo tiene sentido para las personas que lo conocen, mientras que el segundo también es significativo para los demás debido a una convención establecida. Pero incluso si "la casa de Maddy" no tiene una dirección, todavía tiene una latitud y longitud que podría darle a alguien que quiera dispararle un misil. :-)