Как ни досадно неспецифичны все текущие ответы, они в основном правильные, но со многими оговорками, не всегда упоминаемыми. Суть в том, что у вас есть два верхних предела, и только один из них действительно определен, поэтому YMMV :
1. Ограничение времени компиляции
По сути, что позволит ваш компилятор. Для Visual C ++ 2017 в 64-разрядной версии Windows 10 это мой максимальный лимит во время компиляции до ограничения в 2 ГБ,
unsigned __int64 max_ints[255999996]{0};
Если бы я сделал это вместо этого,
unsigned __int64 max_ints[255999997]{0};
Я бы получил:
Error C1126 automatic allocation exceeds 2G
Я не уверен, как 2G коррелирует с 255999996
/ 7
. Я гуглил оба числа, и единственное, что я мог найти, возможно, было связано с этим * nix Q & A о проблеме точности с dc
. В любом случае, кажется, что не имеет значения, какой тип массива int вы пытаетесь заполнить, сколько элементов может быть выделено.
2. Ограничения времени выполнения
У вашего стека и кучи есть свои ограничения. Эти ограничения являются значениями, которые изменяются в зависимости от доступных системных ресурсов, а также от того, насколько «тяжелым» является само ваше приложение. Например, с моими текущими системными ресурсами я могу заставить это работать:
int main()
{
int max_ints[257400]{ 0 };
return 0;
}
Но если я немного подправлю ...
int main()
{
int max_ints[257500]{ 0 };
return 0;
}
Bam! Переполнение стека!
Exception thrown at 0x00007FF7DC6B1B38 in memchk.exe: 0xC00000FD:
Stack overflow (parameters: 0x0000000000000001, 0x000000AA8DE03000).
Unhandled exception at 0x00007FF7DC6B1B38 in memchk.exe: 0xC00000FD:
Stack overflow (parameters: 0x0000000000000001, 0x000000AA8DE03000).
И просто для того, чтобы подробно описать всю тяжесть вашего приложения, все было хорошо:
int main()
{
int maxish_ints[257000]{ 0 };
int more_ints[400]{ 0 };
return 0;
}
Но это вызвало переполнение стека:
int main()
{
int maxish_ints[257000]{ 0 };
int more_ints[500]{ 0 };
return 0;
}