Perché hai dichiarato x come 'statico' che lo rende una variabile globale. È noto solo alla funzione main() in cui è dichiarata. Dichiarando YY al di fuori di qualsiasi funzione, l'hai reso globale. 'static' lo rende anche globale, ma noto solo a questo file.
Se hai dichiarato YY come solo "const int YY = 1024", il compilatore potrebbe trattarlo come un #define, ma con un tipo. Questo dipende dal compilatore.
A questo punto, 2 cose potrebbero essere errate.
1:
Tutte le variabili globali vengono inizializzati in fase di esecuzione, prima di main() si chiama.
Poiché sia x che YY sono globali, vengono entrambi inizializzati.
Quindi, l'inizializzazione del runtime di x globale dovrà allocare lo spazio in base al valore in YY. Se il compilatore non considera YY come #define con un tipo, deve fare un giudizio in fase di compilazione sui valori di runtime.Potrebbe assumere il più grande valore possibile per un int, che sarebbe davvero troppo grande. (O forse negativo dato che l'hai lasciato firmato)
Potrebbe essere interessante vedere cosa succede se cambi solo YY in un corto, preferibilmente un corto senza segno. Quindi il suo massimo sarebbe 64K.
2:
La dimensione dello spazio globale può essere limitato nel sistema. Non hai specificato la piattaforma di destinazione e il sistema operativo, ma alcuni hanno solo molto.
Poiché hai dichiarato x come dimensione YY, l'hai impostato per prendere i caratteri YY dallo spazio globale. Ogni elemento in esso sarebbe essenzialmente globale. Se lo spazio globale del tuo sistema è limitato, 1024 caratteri potrebbero essere troppo.
Se si dichiarava x come puntatore al char, sarebbero necessari byte sizeof (char *). (4 byte è la dimensione di un puntatore sulla maggior parte dei sistemi.) Con questo, è necessario impostare il puntatore sull'indirizzo dello spazio correttamente malloc'd.
Dichiarando x senza 'statico', diventa una variabile locale e viene inizializzato solo dopo l'esecuzione della funzione proprietaria. E il suo spazio è preso dalla pila, non dallo spazio globale. (Questo può ancora essere un problema per sistemi o thread con stack molto limitato.) Il valore di YY è stato da tempo impostato da questo punto, quindi non ci sono problemi.
anche:
Non ricordo se c'è alcuna garanzia che globali vengono inizializzati in qualsiasi ordine. In caso contrario, x potrebbe essere inizializzato prima di YY. Se ciò accadesse, allora YY avrebbe semplicemente contenuto casuale della RAM.
La variabile è in realtà * non * creata nello stack in virtù del 'statico' in' static char x [YY] ' – Dirk