Оба не должны использоваться, один работает, потому что (как сказал @eerorika) автоматические массивы c разрешены во время выполнения, но глобальные массивы должны иметь stati c хранилище.
Если вы Если вы хотите объявить массив с переменным размером (например, заданный std :: cin), вы должны сделать что-то вроде:
int x;
std::cin >> x;
const int n = x;
float arr[n];
Но вы не сможете установить его так, чтобы он содержал только нули с float arr[n] = {0}
(если вам нужно добавить значение в массив, не будучи уверенным, что вы его установили), вам нужно будет использовать al oop вот так
for(int i = 0; i < n; i++)
{
arr[i] = 0;
}