每次我尝试执行此操作时,都会出现分段错误。这真的让我很困扰,因为这是一项相当困难的任务,而且很晚了,因为我无法解决这一问题。当我尝试运行 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);
您似乎正在尝试将 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);