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