每次我尝试执行此操作时,都会出现段错误。这真的很困扰我,因为这是一项非常困难的任务,而且它迟到了,因为我无法解决这件事。当我尝试运行 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/