将文件指针传递给方法时出现C分段错误

时间:2013-12-13 23:11:09

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

每次我尝试这样做时都会出现分段错误。这真的很困扰我,因为这是一个非常困难的任务,而且已经很晚了,因为我无法解决这个问题。当我尝试运行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;
}

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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);