"Access violation writing location" 尝试读取文件时

"Access violation writing location" when trying to read from a file

我遇到了这个错误

Exception thrown at 0x0FC04AFF (vcruntime140d.dll) in Ergasia.exe: 0xC0000005: Access violation writing location 0x00000020.

If there is a handler for this exception, the program may be safely continued.

将我带到代码的这一部分:

for (unsigned int i = 0; i < width*height * 3; i = i + 3) {

    file.read((char *)cR, 1);
    file.read((char *)cG, 1);
    file.read((char *)cB, 1);

    buffer[i] = cR / 255.0f;
    buffer[i + 1] = cG / 255.0f;
    buffer[i + 2] = cB / 255.0f;
}

我尝试使用 try/catch 和其他一些 if 检查,但都没有用。有人知道是什么原因造成的吗?

导致它的原因是您试图在位置 0x20 处写入内存,但这是不可能的,因为在如此低的内存位置上从来没有任何可写内存。您可以通过阅读错误消息很容易地解决这个问题:

Access violation writing location 0x00000020

下一个明显的问题是您在地址 0x20 处获得指向内存的指针,因为这显然不是有效地址。您的代码有些不完整,使用了我们看不到其定义的变量,但在我看来您正在将字符值转换为 char*,这几乎肯定是不正确的。据推测,cRcGcB 应该是 RGB 位图的红色、绿色和蓝色通道的强度。它们 不是 指向内存的指针,所以你不应该将它们转换为 char* 就好像它们是。

我假设 file.read 是一个从文件中读取颜色值并将其写入第一个参数指向的内存位置的函数。如果这是真的,那么您应该将变量的 address 传递给函数,而不是 casting 指针的值。 &(寻址)运算符在 C++ 中用于检索指向变量的指针:

file.read(&cR, 1);
file.read(&cG, 1);
file.read(&cB, 1);

正如其他人在评论中正确指出的那样,您不应该捕获访问冲突错误。而且,一般来说,在尝试捕获和忽略异常之前,您应该确保异常不是由程序中的错误引起的。