Pregunta

Cuando se inicia un programa C y las variables se asignan a ubicaciones de memoria, ¿el estándar C dice si ese valor se inicializa?

// global variables
int a;
int b = 0;
static int c;

En el código anterior, 'b' se inicializará a 0. ¿Cuál es el valor inicial de 'a'? ¿Es 'c' diferente ya que es estático para este módulo?

¿Fue útil?

Solución

Dado que menciona específicamente las variables globales : en el caso de las variables globales, ya sea que se declaren estáticas o no, se inicializarán a 0.

Las

variables locales , por otro lado, serán indefinidas (a menos que se declaren static , en cuyo caso también se inicializarán a 0 - gracias Tyler McHenry). Traducido, eso significa que no puede confiar en que contengan algo en particular: solo contendrán cualquier basura aleatoria que ya esté en la memoria en esa ubicación, que podría ser diferente de una ejecución a otra.

Otros consejos

  

Editar: Lo siguiente solo se aplica a las variables locales, no a las globales.

El valor inicial de una variable no está definido. En algunos idiomas, la ubicación de una variable en la memoria se pone a cero cuando se declara, pero en C (y también en C ++) una variable no inicializada contendrá cualquier basura que viva en esa ubicación en ese momento.

Entonces, la mejor manera de pensarlo es que una variable no inicializada probablemente contendrá basura y tendrá un comportamiento indefinido.

a será cero, y c también, si son globales y no se inicializan explícitamente. Esto también es cierto para las variables estáticas locales.

Solo las variables locales no estáticas no se inicializan. Tampoco se inicializa la memoria asignada con malloc.

Ver aquí para reglas de inicializaciones y asignación en C para los diferentes objetos.

Estoy escribiendo muy despacio esta mañana. Tres personas aparecieron rápidamente mientras respondía, así que eliminé la mayor parte de mi publicación. El enlace que encontré fue claro y breve, así que estoy publicando eso de todos modos: Wikipedia en " variable no inicializada " para una discusión de los problemas básicos.

Una prueba rápida muestra que ayc son 0.

int a;
static int c;
int main() {
    printf("%d %d\n", a, c);
    return 0;
}

La ubicación de a (yc) se determina en tiempo de compilación; es decir, no se colocan en la pila ni en un intervalo de memoria devuelto por malloc. Creo que el estándar C dice que se inicializan a 0 en todos los casos, entonces.

Estoy 99.9% seguro con respecto a c , y 98% seguro con respecto a a . La palabra clave static , en el contexto de variables globales, es realmente análoga a private en (digamos) C ++ y Java: se trata de visibilidad, no de ubicación de almacenamiento.

Lo que dice Andrew Hare sobre las variables no inicializadas es cierto para los datos almacenados en la pila o en la memoria mal asignada. No es así para las variables almacenadas estáticamente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top