【发布时间】:2020-11-13 12:26:53
【问题描述】:
我的程序多次遍历我的代码的这一部分而没有问题。然后,在文件的中间,文件指针被设置为占位符(原始地址被删除),当我尝试向后 fseek 1 个字符时遇到访问冲突。
我对其进行了多次调试,似乎没有任何地方我在进行此 fseek 之前清除了文件指针或将其设置为另一个值。正如我之前所说,我的这部分代码运行了很多次都没有问题,但是这个错误似乎很随机,我想不出它发生的原因。
您可以使用 fseek 的次数是否有限制?如果我打算经常使用它,我需要做其他事情吗?一定次数的使用会抹去文件指针的值吗?
我不是从文件的开头寻找或任何类似疯狂的东西,它只是在中间轻拍,我只是想向后移动一个字符。
Exception thrown at 0x77A460C5 (ntdll.dll) in Hw04.exe: 0xC0000005: Access violation writing location 0x656D6F87.
ch = fgetc(input);
if (isInvisibleChar(ch) || isalpha(ch) || isdigit(ch) || ch == EOF) {
if (id == getId(".")) {
emit(11, 0, 3);
strcpy(token, ".");
}
printf("%s\t%d\n", token, id);
sprintf(temp, "%d ", id);
strcat(lexemeList, temp);
sprintf(temp, "%s ", names[id - 1]);
strcat(symbolList, temp);
foundTok = 1;
}
if (!isInvisibleChar(ch)) {
fseek(input, -1L, SEEK_CUR); //<-----------The Access Violation is here
}
注意 - 这个问题在 fseek 周围有和没有 if 语句时都会发生
【问题讨论】:
-
例如,如果
input是一个局部变量,它可能会被fseek之前的字符串操作之一中的缓冲区溢出清除。问题出在未显示的代码中的其他地方,这就是为什么您需要发布MCVE。 -
什么是
input?如果它不是真正的文件,则可能不支持负偏移量。恕我直言ungetc更加健壮,因为它支持任何输入流。 -
symbolList会溢出吗?
标签: c file access-violation seek fseek