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

堆栈允许的最大值通常约为8Mb的大小,至少在一个GNU/Linux发行版,它可能会有所不同,但它可能不会是那么大。 – user2485710

+0

在同一个流上使用'scanf'和'fgets'被绑定到[cause problems](http://stackoverflow.com/questions/5918079/fgets-doesnt-work-after-scanf)。另外:你将'&infile'('FILE **')传递给'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

你可能还想提一下,分配一个10MB缓冲区来加载一个任意文件可能是一个糟糕的设计 – Pyrce

+0

@Pyrce,好点,我现在这样做 – simonc

+0

是的,就是这样。回想起来,这是一个可怕的想法。我只是想确保字符串足够长以容纳任何评论,甚至不切实际的长评论。谢谢! – user3101076

1

看来你正试图通过INFILE的地址写的任何风险去fgets。

与fgets被定义为:

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

在你的函数parseInputStream INFILE是流。

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

因此,您在调用fgets时不需要将引用传递给infile。

fgets(string, 9999999, &infile); 

它应该是:

fgets(string, 9999999, infile); 
+0

我正在切换所有试图修复分段错误的文件指针。这个错误只是当我把代码恢复到它最初提交我的问题的方式时,我没有彻底。 – user3101076