Ошибка сегментации с помощью fscanf для больших файлов - PullRequest
0 голосов
/ 09 февраля 2020

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

Следующий код отлично работает на меньших входных данных, но мне интересно - почему это ошибка на больших входных файлах? Я могу распечатать все значения в для l oop, перед тем как получим Ошибка сегментации: 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);

1 Ответ

2 голосов
/ 09 февраля 2020

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

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

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

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

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

...