我正在用C语言编写一个tic-tac-toe程序。我的代码如下所示。
#include <stdio.h>
#include <conio.h>
char evaluateWinConditions(char board[3][3]);
int main(void)
{
puts("---");
puts("---");
puts("---");
char board[3][3] = {{"-"}}; // board
char key = 0; // stores key presses
// stores position of mouse pointer
int row = 1;
int column = 1;
// stores player turn
int player = 1;
printf("\033[%d;%dH", row, column);
while (evaluateWinConditions(board) == 0) {
key = _getch();
switch (key) {
case 'a':
column -= 1;
break;
case 'w':
row -= 1;
break;
case 'd':
column += 1;
break;
case 's':
row += 1;
break;
case ' ':
if (player == 1) {
printf("%c", 'X');
board[row][column] = 'X';
player = 2;
}
else {
printf("%c", 'O');
board[row][column] == 'O';
player = 1;
}
break;
}
printf("\033[%d;%dH", row, column);
}
printf("\033[5;1H");
if (evaluateWinConditions(board == 1)) printf("Player 1 wins.");
else printf("Player 2 wins.");
}
char evaluateWinConditions(char board[3][3])
{
if (board[0][0] == board[0][1] == board[0][2] ||
board[1][0] == board[1][1] == board[1][2] ||
board[2][0] == board[2][1] == board[2][2] ||
board[0][0] == board[1][1] == board[2][2] ||
board[0][2] == board[1][1] == board[2][0]) {
if (board[0][0] == "X") return 1;
else return 2;
}
else {
return 0;
}
}
当我编译程序时,没有任何错误。但是,当我运行该程序时,我收到一个代码为-1073741819的运行时错误。我使用的是Windows 10 64位和Visual Studio 2019。当我运行程序时,这个错误大约在一秒钟后出现。当我在Visual Studio中调试程序时,在第74行收到一个错误:抛出异常:读取访问冲突;board in nullptr“
发布于 2021-07-29 01:07:07
异常的可能原因是函数调用evaluateWinConditions(board == 1)
中无意义的比较board == 1
的结果。board == 1
比较是一种约束冲突(在指针和非null指针常量的整数之间使用相等运算符),其计算结果可能是int
值0,而int
值0(这里不是null指针常量)可能正在以实现定义的方式转换为char (*)[3]
类型的null指针(由于缺乏显式强制转换,这是另一个约束冲突),以成为evaluateWinConditions
函数中board
参数的值。evaluateWinConditions
函数正在取消引用空指针,从而导致访问冲突异常。
在原始代码中还有很多其他错误。
https://stackoverflow.com/questions/68563716
复制相似问题