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 页面:
我的程序多次通过我的代码的这一部分没有问题。然后,在文件的中间,文件指针被设置为占位符(原始地址被删除),当我试图向后查找 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 页面: