Из стандарта C ++ 17 (инициализаторы 11.6)
12 Если для объекта не указан инициализатор, объект инициализируется по умолчанию. Когда получается хранилище для объекта с автоматическим c или динамическим c сроком хранения, объект имеет неопределенное значение, и если для объекта не выполняется инициализация, этот объект сохраняет неопределенное значение до тех пор, пока это значение не будет заменено (8.18 ). [Примечание: объекты со значением c или продолжительностью хранения потока инициализируются нулями, см. 6.6.2. - конец примечания]
Таким образом, массив, объявленный в глобальном пространстве имен, имеет стати c длительность хранения и инициализируется нулями
, в то время как массив, объявленный в main, имеет автомат c длительность хранения и имеет неопределенные значения своих элементов.
Обратите внимание, что массивы переменной длины не являются стандартной функцией C ++.
int M = 1000;
int a[M];
или
cin >> M;
int a[M];
То есть обе программы не соответствуют стандарту.
Более того, массивы переменной длины не могут быть явно инициализированы в объявлении.
Некоторые компиляторы могут поддерживать их как собственные языковые расширения.