"访问违规写入位置"当试图从文件中读取时

时间:2016-11-26 14:36:02

标签: c++ access-violation

我收到此错误

  

Ergasia.exe中0x0FC04AFF(vcruntime140d.dll)抛出异常:0xC0000005:访问冲突写入位置0x00000020。

     

如果存在此异常的处理程序,则可以安全地继续该程序。

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

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和其他一些如果检查但没有工作。任何人都知道造成它的原因是什么?

1 个答案:

答案 0 :(得分:1)

导致它的原因是你试图写入0x20位置的内存,但这是不可能的,因为在这么低的内存位置永远不会有任何可写内存。您可以通过阅读错误消息轻松地解决这个问题:

  

访问冲突写入位置0x00000020

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

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

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

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