C++ - 访问违规读取
C++ - Access violation reading
我在运行并选择放置标记的位置后立即收到"访问违规读取位置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;
};
发布印刷品,如果让你的生活更美好:错误的图像
我看到几个问题:
-
尚未在构造函数中初始化
playGame
的成员变量。使用未初始化成员变量的值会导致未定义的行为。 -
您在
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。
我不知道这是否可以解释你的问题,但在你的代码中,我看到了一件我觉得有点奇怪的事情。
将x
和y
定义为playGame
类的成员。
所以,当你在play()
写作时
x = getX();
y = getY();
在你写的getX()
和getY()
return x;
和
return y;
您正在复制成员x
中的成员x
到getX()
和成员y
中的成员y
到getY()
。
建议:从类中删除x
和y
成员playGame
并将x
和y
定义为方法中的局部变量。
保护你的函数 placeMarker 以确保你在访问数组时没有越界,即:
if(x > MAX_X || x< MIN_X) return false;
if(y > MAX_Y || y< MIN_Y) return false;
相关文章:
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 读取访问冲突.这0xCDCDCDCD
- 尝试通过共享指针使用变量时读取访问冲突
- C++ 读取访问冲突,0xCDCDCDCD
- 从二进制文件中读取元素时引发异常(引发异常:读取访问冲突. _Pnext 0xB414D4)
- 使用智能指针读取访问冲突
- 引发异常:读取访问冲突.**此**0x40错误
- 函数 AfxEndThread 中的读取访问冲突"pThread-> was nullptr"
- Visual Studio图形调试器引发读取访问冲突异常
- C++中的内存分配(引发异常:读取访问冲突)
- 引发异常:读取访问冲突 [C++]
- 尝试从单向链表C++中删除单个节点时出现读取访问冲突
- 引发未经处理的异常:简单 C++ 程序中的读取访问冲突,动态增加数组长度以存储数字
- 错误 : 异常 : 引发未处理的异常: 读取访问冲突.0xDDDDDDDD临时温度
- 读取访问冲突. _Mycont 在 C++ 中将 udp 数据放入向量时出现 nullptr 错误
- 读取访问冲突0xCDCDCDCD
- Vector::p ush_back() 给出读取访问冲突
- 访问共享内存时出现读取访问冲突
- 挂钩创建文件抛出异常:读取访问冲突
- 在字符串驱动器中读取访问违规