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

问题描述 投票:0回答:2

每次我尝试执行此操作时,都会出现分段错误。这真的让我很困扰,因为这是一项相当困难的任务,而且很晚了,因为我无法解决这一问题。当我尝试运行 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;
}
c pointers file-io segmentation-fault
2个回答
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
投票

您似乎正在尝试将 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);
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.