2015-12-22 5 views
-4

При возникновении проблем с ошибкой сегментации 11.Ошибка сегментации 11 C

/* Create main function */ 
int main() 
{ 
    char line[9999999]; 
    FILE *fp; 
    fp = fopen("file.txt", "r"); 
    while (fgets(line, 9999999, (FILE*)fp) != NULL) 
    { 
     if (strstr(line, "word") != NULL) 
     { 
      printf("%s", line); 
     } 
    } 
    fclose(fp); 
    return 0; 
} 

Уже пытались уменьшить 9999999 до 256, но это тоже не работает ..

Заранее спасибо

+1

Когда вы уменьшили с 9999999 до 256? вы отредактировали как 'line [9999999];' и 'fgets (строка, 9999999,'? проще использовать/поддерживать 'while (fgets (строка, размер строки, fp)! = NULL)' – chux

+1

* Какой * '9999999 для Вы пытались уменьшить? Оба из них? –

+0

У меня были бы проблемы с сохранением того же числа '9' в обоих целых числах ... – Downvoter

ответ

1

Я думаю Есть 2 потенциальные проблемы

Задача 1 является стек , Стек представляет собой (относительно) небольшой бит памяти, используемый в потоке, чтобы отслеживать функции автоматически изменяемых переменных, значений внутри и снаружи и т. Д. Он не предназначен для больших объемов данных. Вполне возможно, что ваш буфер line слишком велик для стека!

Если вы хотите, чтобы буфер был большим, лучше всего использовать malloc() для размещения на куче. Куча большая, и если выделение не удастся, вы можете обнаружить ее и обработать соответствующим образом.

Проблема 2 не проверяет значение fp. fopen() может вернуть NULL, если ему не удается открыть файл. Если это так, и вы пройдете fp до fgets(), вы получите ошибку seg.

Когда я обратился эти две проблемы на моей машине, ваша программа работала ...

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define BUFSIZE 99999 

int main() 
{ 
    char *line = malloc(BUFSIZE); 
    FILE *fp = fopen("file.txt", "r"); 
    if(!line || !fp) { 
     printf("OOPS"); 
     free(line); 
     return 1; 
    } 

    while (fgets(line, BUFSIZE, fp) != NULL) 
    { 
     if (strstr(line, "word") != NULL) 
     { 
      printf("%s", line); 
     } 
    } 
    fclose(fp); 
    free(line); 
    return 0; 
} 

Примечание fgets() читает максимум один меньше, чем значение параметра размера и добавит нулевой терминатор для вас.

1

В моих тестах под cygwin + gcc 4.9.3 моя программа вылетает, когда размер массива равен 9999999, но не 999999.

Виновником здесь является то, что массив слишком велик для размещения в стеке памяти.

Simpler программа, которая выходит из строя:

#define SIZE 9999999 
int main() 
{ 
    char line[SIZE]; 
    line[SIZE-1] = '\0'; 
    return 0; 
} 

Он отлично работает, когда я меняю SIZE на:

#define SIZE 999999 

Создание больших массивов в памяти стека является хорошо известная проблема. См. Why does a large local array crash my program?.

Смежные вопросы