Стандарт C определяет множество нижних/верхних ограничений (ограничения перевода<). /strong>) и накладывает реализацию, которая должна удовлетворять каждому переводу. Почему нет такого минимального предела, определенного для размера массива? Следующая программа скомпилируется нормально и, вероятно, выдаст ошибку/segfault во время выполнения и вызовет неопределенное поведение.
int main()
{
int a[99999999];
int i;
for(i=0;i<99999999;i++)
a[i]=i;
return 0;
}
Возможной причиной может быть то, что локальные массивы выделяются в автоматическом хранилище, и это зависит от размера выделенного кадра стека. Но почему не минимальный предел, как другие пределы, определенные C?
Давайте забудем о неопределенных случаях, подобных приведенным выше. Рассмотрим следующее:
int main()
{
int a[10];
int i;
for(i=0;i<10;i++)
a[i]=i;
return 0;
}
Что в приведенном выше дает мне гарантию, что локальный массив (несмотря на то, что он очень маленький) будет работать так, как ожидалось, и не приведет к неопределенному поведению из-за сбоя выделения?
Хотя маловероятно, что выделение для такого небольшого массива не удастся на каких-либо современных системах. Но стандарт C не определяет каких-либо требований, и компиляторы не сообщают (по крайней мере, GCC) об ошибках выделения памяти. Возможна только ошибка времени выполнения/неопределенное поведение. Сложность заключается в том, что никто не может сказать, приведет ли массив произвольного размера к неопределенному поведению из-за сбоя выделения.
Обратите внимание, что я знаю, что могу использовать динамические массивы (через malloc и др.) для этой цели и иметь лучший контроль над ошибками распределения. Меня больше интересует, почему для локальных массивов не определено такое ограничение. Кроме того, глобальные массивы будут храниться в статической памяти, что увеличит размер исполняемого файла, с которым могут справиться компиляторы.