2015-12-08 17 views
0

У меня есть программа, которая принимает два параметра, целое число и строку. Первое представляет количество строк, которые нужно прочитать из файла, имя которого является вторым аргументом. Файлы имеют целочисленное значение для каждой строки.C fopen seg fault

int main(int argc, char* argv[]) 
{ 

// the size of the data set 
long dataSize = atol(argv[1]); 

// an array to store the integers from the file 

long dataSet[dataSize]; 
// open the file 
fp = fopen(argv[2], "r"); 
// exit the program if unable to open file 
if(fp == NULL) 
{ 
printf("Couldn't open file, program will now exit.\n"); 
exit(0); 
} // if 

У меня есть файл с именем data10M с 10 миллионами целых чисел. Он отлично работает, пока я не сменил первый аргумент на что-то большее, чем около 1050000, после чего программа выдает ошибку сегментации на линии fopen.

+3

В Windows процесс по умолчанию размер стека составляет 1Мб, на Linux это 8MB. Большинство компиляторов помещают переменные, включая массивы, в стек. В 64-битной системе один «длинный» может быть 64 бита (8 байтов). Вы делаете математику. :) –

+1

'long dataSet [dataSize];' изменять на 'static' или использовать' malloc', потому что для обеспечения стека – BLUEPIXY

ответ

3

Вы получаете переполнение стека!

Локальные переменные помещаются в стек. Кажется, что ваш компилятор/компоновщик C выделяет 8-мегабайтный стек (предположим, что long 8 байтов). 1050000 * 8 - более 8 Мб.

Вы получаете ошибку seg при попытке выделить массив, который не подходит.

Попробуйте allocationg массив в куче вместо:

// an array to store the integers from the file 
long *dataSet = malloc(dataSize * sizeof(long));