C++ - 访问违规读取

C++ - Access violation reading

本文关键字:读取 访问 C++      更新时间:2023-10-16

我在运行并选择放置标记的位置后立即收到"访问违规读取位置0x007CE4F8"(在帖子末尾打印错误)。

我是一个乞丐 c++ 程序员,所以如果你能保持最简单的解释,我会很高兴。

主.cpp

    #include <iostream>
    #include "playGame.h"
    using namespace std;
    int main()
    {
        playGame game;
        game.play();
        system("PAUSE");
        return 0;
    }

玩游戏.cpp

#include "playGame.h"
#include <iostream>
using namespace std;
playGame::playGame()
{
}
bool playGame::play()
{
    char player1 = 'X';
    char player2 = 'O';
    bool gameOver = false;
    int turn = 0;
    char currentPlayer = player1;
    clearBoard();
    while (gameOver == false)
    {
        printBoard();
        x = getX();
        y = getY();
        while (placeMarker(x, y, currentPlayer) == false)
        {
            cout << "***Place already taken!***" << endl;
            x = getX();
            y = getY();
        }
            turn++;
    }
    return gameOver;
}
void playGame::clearBoard()
{
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            board[i][j] = ' ';
        }
    }
}
void playGame::printBoard()
{
    cout << endl;
    cout << " |1 2 3|n";
    for (int i = 0; i < 3; i++) {
        cout << " -------n";
        cout << i + 1 << "|" << board[i][0] << "|" << board[i][1] << "|" << board[i][2] << "|n";
    }
    cout << " -------n";
}
int playGame::getX()
{
    while ((x < 1) || (x > 3)) {
        cout << "Choose X coordinate (1 - 3): ";
        cin >> x;
        if ((x < 1) || (x > 3))
        {
            cout << "Bad input" << endl;
        }
        else
        {
            x--;
            return x;
        }
    }
}
int playGame::getY()
{
    while ((y < 1) || (y > 3)) {
        cout << "Choose Y coordinate (1 - 3): ";
        cin >> y;
        if ((y < 1) || (y > 3))
        {
            cout << "Bad input" << endl;
        }
        else
        {
            y--;
            return y;
        }
    }
}
bool playGame::placeMarker(int x, int y, char currentPlayer)
{
    if (board[y][x] != ' ')
    {
        return false;
    }
        board[y][x] = currentPlayer;
        return true;
}

玩游戏.h

#pragma once
#include <iostream>
using namespace std;
class playGame
{
public:
    playGame();
    bool play();
private:
    void clearBoard();
    void printBoard();
    int getX();
    int getY();
    bool placeMarker(int x, int y, char currentPlayer);
    char board[3][3];
    int x, y;
};

发布印刷品,如果让你的生活更美好:错误的图像

我看到几个问题:

  1. 尚未在构造函数中初始化 playGame 的成员变量。使用未初始化成员变量的值会导致未定义的行为。

  2. 您在 getX()getY() 的所有分支中都没有 return 语句。这是导致未定义行为的原因。

更新构造函数以具有合理的初始值。

playGame::playGame() : x(0), y(0)
{
   for ( int i = 0; i < 3; ++i )
   {
      for ( int j = 0; j < 3; ++j )
      {
         board[i][j] = ' ';
      }
   }
}

getX()更新至:

int playGame::getX()
{
   // Make x invalid before starting the while loop.
   // Otherwise, the last valid value will be returned.
   x = 0;
   while ((x < 1) || (x > 3))
   {
      cout << "Choose X coordinate (1 - 3): ";
      cin >> x;
      if ((x < 1) || (x > 3))
      {
         cout << "Bad input" << endl;
      }
   }
   x--;
   return x;
}

更新getY()类似。

在构造函数中将 x 和 y 初始化为例如 0(范围 1-3 之外的内容),并在放置标记后将它们重置为 0。

我不知道这是否可以解释你的问题,但在你的代码中,我看到了一件我觉得有点奇怪的事情。

xy定义为playGame类的成员。

所以,当你在play()写作时

    x = getX();
    y = getY();

在你写的getX()getY()

    return x;

    return y;

您正在复制成员x中的成员xgetX()和成员y中的成员ygetY()

建议:从类中删除xy成员playGame并将xy定义为方法中的局部变量。

保护你的函数 placeMarker 以确保你在访问数组时没有越界,即:

if(x > MAX_X || x< MIN_X) return false;
if(y > MAX_Y || y< MIN_Y) return false;