1

Каждый раз, когда я пытаюсь это сделать, я получаю ошибку сегментации. Это действительно беспокоило меня, потому что это было довольно сложное задание и его последнее, потому что я не могу это исправить. Я получаю ошибку сегментации, когда пытаюсь запустить parseInputStream. Я попытался изменить указатель файла на указатель на указатель файла, но я все еще получаю ошибку сегментации. Консоль печатает все ns, но ни один из ws. Помоги пожалуйста.C Ошибка сегментации при передаче указателя файла на метод

void parseInputStream(FILE *file, FILE *infile){ 
    printf("w\n"); 
    char string[9999999]; 
    while(fscanf(infile, "%s", &string)!= EOF){ 
      printf("w\n"); 
      if(string[0] == ';'){ 
      fgets(string, 9999999, infile); 
      continue; 
      } 
      parseInput(file, infile, string); 
} 



int main(int argc, char* argv[]){ 
    printf("n\n"); 
    FILE *file = fopen("intest.asm", "w"); 
    printf("n\n"); 
    FILE *infile = fopen("intest.j", "r"); 
    printf("n\n"); 
    parseInputStream(file, infile); 
    fclose(infile); 
    fclose(file); 
    return 0; 
} 
+1

максимальных стек допустимого размер обычно составляет около 8 МБ в размере, по крайней мере, при распределении/Linux GNU, она может меняться, но это, вероятно, не будет, что большое , – user2485710

+0

Использование 'scanf' и' fgets' в том же потоке связано с [причиной проблем] (http://stackoverflow.com/questions/5918079/fgets-doesnt-work-after-scanf). Кроме того: вы передаете '& infile' (' ФАЙЛ ** ') в' fgets', ваш компилятор должен жаловаться на это. – Kninnug

ответ

3
char string[9999999]; 

пытается объявить только под 10Mb в стеке. Это, по-видимому, слишком велико и вызывает переполнение стека.

Простейшим решением является перемещение string в другую область памяти. Вы можете переместить его, чтобы иметь статическую продолжительность:

static char string[9999999]; 

или вы могли бы выделить его динамически:

char* string = malloc(9999999); 
if (string==NULL) { 
    // no memory, exit 
} 
// your code as before 
free(string); 

Кроме того, как отметил Pyrce, выделения буфера размером 10 мегабайт, как это, вероятно, плохой знак. Если вам нужно прочитать весь файл в памяти, вы можете сначала проверить его размер, а затем выделить буфер, который точно соответствует размеру. Если вы просто хотите, чтобы прочитать отдельные слова, вероятно, можно предположить, меньший максимум и сказать fscanf размера вашего буфера, чтобы избежать какой-либо риски письма за его пределы

char string[100]; 
fscanf("%99s", string); 
+0

Возможно, вы также захотите упомянуть, что это, вероятно, плохой дизайн для размещения буфера 10 МБ для загрузки произвольного файла – Pyrce

+0

@Pyrce, хорошо, я сделал это сейчас – simonc

+0

Да, именно так. Оглядываясь назад, это была ужасная идея. Я просто хотел удостовериться, что строка была достаточно длинной, чтобы содержать какие-либо комментарии, даже нереально длинные. Благодаря! – user3101076

1

Кажется, вы пытаетесь передать адрес INFILE to fgets.

fgets определяется как:

char *fgets(char *s, int size, FILE *stream); 

В вашей функции parseInputStream INFILE представляет собой поток.

void parseInputStream(FILE *file, FILE *infile){ 

Поэтому вам не нужно передавать ссылку на infile при вызове fgets.

fgets(string, 9999999, &infile); 

Оно должно быть:

fgets(string, 9999999, infile); 
+0

Я переключал все указатели файлов, пытаясь исправить ошибку сегментации. Эта ошибка была только мне не тщательной, когда я возвращал свой код к тому, как изначально был отправлен мой вопрос. – user3101076

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