【问题标题】:C: Access Violation after numerous uses of fseekC:多次使用 fseek 后访问冲突
【发布时间】: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


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-16
    • 1970-01-01
    • 1970-01-01
    • 2023-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多