Я не был в состоянии воспроизведите это поведение на моем блоке SLES 10 (gcc 4.1.2, да, он старый). Я получаю segfault независимо от того, как объявляется lim
.
Я собираюсь идти путь, путь, путь, путь на очень тощего конечности и указывают на то, что ваше определение main
неверно; argv
не должен быть объявлен const
(стандартное требование о том, что строки, на которые указывает массив argv
, должны быть модифицируемыми). Этот бит неопределенного поведения может быть достаточно, чтобы вызвать разницу, но я серьезно сомневаюсь в этом.
В любом случае, пытаясь выделить 2 миллиона что-нибудь в массиве auto
(VLA или нет) почти всегда плохой juju. Возможно, когда компьютерная память будет регулярно измеряться в терабайтах, это уже не будет проблемой, но на данный момент она будет больше, чем обычно выполняется для стека времени выполнения.
У вас есть несколько вариантов. Во-первых, вы можете объявить массив с длительностью хранения static
, либо объявив его в области файла (вне любой функции), либо с помощью ключевого слова static
. Обратите внимание, это означает, что вы будете не быть в состоянии использовать переменную lim
указать размер (даже если вы объявляете его const
, lim
не константа, его значение не известно во время компиляции):
int main(int argc, char **argv)
{
static unsigned long long nums2lim[2000000];
...
}
в качестве альтернативы, вы можете выделить его из кучи во время выполнения:
int main(int argc, char **argv)
{
const unsigned long long lim=2000000;
int *nums2lim = malloc(sizeof *nums2lim * lim);
if (nums2lim)
{
...
}
...
}
Это не выглядит как C++ – Eregrith
Ваш стек, скорее всего, не является достаточно большим для 2-х миллионов беззнаковых длинных долгот. – dwcanillas
Локальные переменные, включая массивы, хранятся в стеке, а стек ограничен. В Windows стек по умолчанию - всего один мегабайт, в Linux - 8 МБ. Ваш массив почти * шестнадцать * МБ. –