【问题标题】:C Segmentation error when passing a file pointer to a method将文件指针传递给方法时出现C分段错误
【发布时间】:2013-12-13 23:11:08
【问题描述】:

每次我尝试这样做时都会遇到分段错误。这真的很困扰我,因为这是一项非常困难的任务,而且迟到了,因为我无法解决这个问题。尝试运行 parseInputStream 时出现分段错误。我尝试将文件指针更改为指向文件指针的指针,但我仍然遇到分段错误。控制台打印所有的 ns 但不打印任何 ws。请帮忙。

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;
}

【问题讨论】:

  • 堆栈最大允许大小通常在 8Mb 左右,至少在 GNU/linux 发行版下,它可能会有所不同,但可能不会那么大。
  • 在同一流上使用scanf 和fgets 将绑定到cause problems。另外:你将&infile(FILE **)传递给fgets,你的编译器应该抱怨这个。

标签: c pointers file-io compiler-construction segmentation-fault


【解决方案1】:
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);

【讨论】:

  • 您可能还想提一下,分配 10MB 缓冲区来加载任意文件可能是一个糟糕的设计
  • 是的,就是这样。回想起来,这是一个糟糕的想法。我只是想确保字符串足够长以包含任何评论,即使是不切实际的长评论。谢谢!
【解决方案2】:

您似乎正在尝试将 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);

【讨论】:

  • 我正在切换所有文件指针,试图修复分段错误。当我将代码恢复到最初提交问题的方式时,这个错误只是我不够彻底。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-05
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多