C:多次使用 fseek 后出现访问冲突

C: Access Violation after numerous uses of fseek

我的程序多次通过我的代码的这一部分没有问题。然后,在文件的中间,文件指针被设置为占位符(原始地址被删除),当我试图向后查找 1 个字符时出现访问冲突。

我调试了好几次,在进入这个fseek之前,似乎没有任何地方我清除了文件指针或将其设置为另一个值。正如我之前所说,我的这部分代码运行了很多次都没有问题,但是这个错误似乎是随机的,我想不出它发生的原因。

使用fseek有次数限制吗?如果我打算经常使用它,还需要做其他事情吗?一定次数的使用会清除文件指针的值吗?

我不是从文件的开头 fseeking 或任何疯狂的东西,它在中间轻拍,我只是想向后移动一个字符。

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 语句都会发生此问题

根据访问冲突地址(所有有效的 ascii 字符),我 100% 确定您在某处遇到内存损坏。

您使用了很多 strcpy 和 sprintf。我首先推荐您使用 strncpy 和 snprintf。我还建议您使用任何缓冲区,将其大小增加一倍或四倍,因为很明显,无论您分配多少 space 都不够。

内存损坏错误本来就很难预测 - 它如此随机发生的原因是因为在通常 运行 程序的范围之外发生了一种情况。如果您需要复习,这里是内存损坏的 wiki 页面:

https://en.wikipedia.org/wiki/Memory_corruption