Debido usted declaró x como 'estático' que lo convierte en una variable global. Es conocido solo por la función main() en la que se declara. Al declarar YY fuera de cualquier función, la ha hecho global. 'static' también lo convierte en global, pero solo conocido por este archivo.
Si usted declaró YY tan solo 'const int YY = 1024', el compilador podría tratarlo como un #define, pero con un tipo. Eso depende del compilador.
En este punto 2 cosas podrían estar mal.
1:
Todos globales se inicializan en tiempo de ejecución, antes de main() se llama.
Dado que tanto x como YY son globales, ambos se inicializan entonces.
Por lo tanto, el tiempo de ejecución de inicialización x globales tendrá que asignar espacio en función del valor de AA. Si el compilador no trata YY como #define con un tipo, tiene que hacer un juicio en tiempo de compilación sobre los valores de tiempo de ejecución.Puede suponer el mayor valor posible para un int, que realmente sería demasiado grande. (O posiblemente negativo ya que lo dejó firmado.)
Puede ser interesante ver qué sucede si solo cambia YY a un corto, preferiblemente un corto sin firmar. Entonces su máximo sería 64K.
2:
El tamaño del espacio global puede ser limitado en su sistema. No especificó la plataforma de destino y el sistema operativo, pero algunos tienen solo mucho.
Como ha declarado x como el tamaño YY, lo ha configurado para que tome los caracteres YY del espacio global. Cada char en ella sería esencialmente un global. Si el espacio global en su sistema es limitado, entonces 1024 caracteres pueden ser demasiado.
Si declaró x como un puntero a char, tomaría sizeof (char *) bytes. (4 bytes es el tamaño de un puntero en la mayoría de los sistemas). Con esto, necesitaría establecer el puntero a la dirección del espacio correctamente malloc.
Al declarar x sin 'estático', se convierte en una variable local y solo se inicializa una vez que se ejecuta la función propietaria. Y su espacio se toma de la pila, no del espacio global. (Esto todavía puede ser un problema para sistemas o hilos con una pila muy limitada.) El valor de YY ya se ha establecido en este punto, por lo que no hay problema.
también:
No recuerdo si hay alguna garantía de que las variables globales se inicializan en cualquier orden. Si no, entonces x podría inicializarse antes de YY. Si eso sucediera, YY solo contendría el contenido aleatorio de la RAM.
La variable es realmente * no * creada en la pila en virtud de 'static' en' static char x [YY] ' – Dirk