vc ++访问冲突读取位置

时间:2018-03-07 06:11:41

标签: c++ visual-c++

我收到了一个错误:

First-chance exception at 0x0021F4F2 in Tetris.exe: 0xC0000005: Access violation reading location 0x000000D8.
Unhandled exception at 0x0021F4F2 in Tetris.exe: 0xC000041D: An unhandled exception was encountered during a user callback.

这是我的ColorGrid.cpp文件,当我在函数名const COLORREF ColorGrid::Index(int iRow, int iCol)&运行应用程序时发生错误行返回m_buffer[iRow * COLS + iCol];

#include "StdAfx.h"
#include "ColorGrid.h"
#include <exception> 


ColorGrid::ColorGrid()
{

}
COLORREF& ColorGrid::Index(int iRow, int iCol)
{
    bool flag = false; 
    if ((iRow >= 0) && (iRow < ROWS) && (iCol >= 0) && (iCol < COLS))
    {
        flag = true; 
    }
    if (!flag)
    {
        TRACE("iRow:", iRow, " iCol:", iCol);
    }
    return m_buffer[iRow + COLS + iCol];
}

const COLORREF ColorGrid::Index(int iRow, int iCol) const
{
    try
    {

        bool flag = false;
        if ((iRow >= 0) && (iRow < ROWS) && (iCol >= 0) && (iCol < COLS))
        {
            flag = true;

        }
        if (!flag)
        {
            TRACE("iRow:", iRow, " iCol:", iCol);

        }

        return m_buffer[iRow * COLS + iCol];

    }
    catch (CException* e)
    {
        TCHAR   szCause[255];
        CString strFormatted;
        e->GetErrorMessage(szCause, 255);
        TRACE("exception GetErrorMessage:", szCause);
        TRACE("iRow:", iRow, " iCol:", iCol, "COLS:", COLS);
        e->Delete(); 
    }

}

相关头文件ColorGrid.h:

#ifndef COLOR_GRID_H
#define COLOR_GRID_H
const int ROWS = 20; 
const int COLS = 10; 
class ColorGrid
{
public:
    ColorGrid(); 
    void Clear(); 
    COLORREF& Index(int iRow, int iCol);
    const COLORREF Index(int iRow, int iCol) const; 

    void Serialize(CArchive& archive);

private:
    COLORREF m_buffer[ROWS * COLS];
};
#endif

这是因为我在标题&amp;中预先分配/初始化了m_buffer[ROWS * COLS]后来我想return m_buffer[iRow * COLS + iCol];返回不同的尺寸?

由于

2 个答案:

答案 0 :(得分:1)

线索在错误消息Access violation reading location 0x000000D8中,您的代码正在尝试访问一个非常低的地址,此地址不适用于普通程序。这将是尝试使用空指针引起的。鉴于从null的偏移非常大,我假设m_buffer为null。

答案 1 :(得分:1)

&#39; iRow&#39;的价值是什么?和&#39; iCol&#39;当访问违规例外时。

如果iRow * COLS + iCol&#39;的总和大于199然后它应该抛出访问冲突。

有人认为我不明白你为什么要回来&#34; return m_buffer [iRow * COLS + iCol]&#34;总是在那个功能。当标志为真时,最好返回。

感谢。