Ошибка сегментации с fscanf на больших файлах

Я пытаюсь сохранить первые два числа в файле как переменные, а остальные числа в файле в виде массива.

Следующий код отлично работает с меньшими входными данными, но мне интересно, почему возникает ошибка с большими входными файлами? Я могу распечатать все значения в цикле for, прежде чем получить ошибку сегментации: 11.

FILE * fp;

fp = fopen("test.text", "r");

int i;
fscanf(fp, "%d", &i);
int param1 = i;
fscanf(fp, "%d", &i);
int param2 = i;

int list[param2];
int j;

for (j = 0; j < param2; j++) {
  fscanf(fp, "%d", &list[j]);
}
fclose(fp);

person GregW    schedule 09.02.2020    source источник
comment
Может быть, это потому, что param2 слишком большой, поэтому int list[param2]; не может быть выделен   -  person ForceBru    schedule 09.02.2020
comment
@ForceBru d не более 2^14.   -  person GregW    schedule 09.02.2020


Ответы (1)


Как уже кратко прокомментировал @ForceBru, это проблема с int list[param2];

Когда список объявлен таким образом, буфер сохраняется в стеке, выделение происходит просто компилятором, увеличивающим указатель стека на количество param2.

Если это скомпилировано с j, выделенным после буфера, что может иметь место здесь, компьютер получит доступ к ячейке stack_pointer + param2 * sizeof(int) + sizeof(int) для хранения 0 (j = 0).

Стек ограничен, отсюда и название этого сайта, когда происходит доступ к буферу, находящемуся далеко за пределами стека, ядро ​​​​просто увидит, что вы пишете где-то очень далеко от любой законной памяти, и предположит, что что-то пошло не так.

Для больших буферов взгляните на malloc.

person Work of Artiz    schedule 09.02.2020