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

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

最佳答案

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

关于将文件指针传递给方法时出现 C 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20577568/

相关文章:

c++ - 输入一个指针并返回该指针的方法?

c - 了解 GCC 内联汇编语法中的输入/输出操作数

c - 有符号整数模无符号整数会产生无意义的结果

c - 如何使用带有双指针变量(没有支持变量)的结构字段?

c++ - 关于C++中 vector 、 union 和指针的问题

java - 在 Java 中读取制表符分隔的文件

c - c中流和直接I/O的区别

c++ - 从C++中的txt文件中读取字符

c - 数组和 scanf 输入是否齐头并进?

c - 自由动态分配数组 C