【问题标题】:Receiving exit code -1073741819 when program is ran程序运行时收到退出代码 -1073741819
【发布时间】:2021-07-28 15:59:48
【问题描述】:

我正在用 C 语言编写井字游戏。我的代码如下所示。

#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 行收到错误“抛出异常:读取访问冲突;板为 nullptr”

【问题讨论】:

  • char board[3][3] = {"-"}; - 这只会初始化数组的单个元素。其余的将为零。字符也写在单引号中。这也适用于您的比较,例如 board[row][column] = "X";
  • 启用编译器警告并修复警告。单个字符是例如'X' 不是 "X"。后者是字符串文字。这在分配或比较 board 的单个元素时很重要。错误的括号:while (evaluateWinConditions(board == 0)),你的意思是while (evaluateWinConditions(board )== 0)?附加提示:代替case 97: // a 使用case 'a':
  • 好的,我做了你列出的更改。我也相应地更改了列出的代码
  • 发生了什么?不,你不应该改变这个问题,因为它应该仍然是一个问题。
  • -1073741819 与 NT 状态码 STATUS_ACCESS_VIOLATION 匹配,但原始无符号 32 位值 0xC0000005 已被解释为有符号 32 位值。

标签: c


【解决方案1】:

异常的可能原因是函数调用evaluateWinConditions(board == 1) 中的无意义比较board == 1 的结果。 board == 1 比较是违反约束(在不是空指针常量的指针和整数之间使用相等运算符),可能评估为 int 值 0 和 int 值 0(这不是此处的空指针常量)可能正在以实现定义的方式转换为 char (*)[3] 类型的空指针(由于缺少显式转换,这是另一个约束违规),以成为 board 参数的值evaluateWinConditions 函数。 evaluateWinConditions 函数正在取消引用该空指针,从而导致访问冲突异常。

原始代码中还有很多其他错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-25
    • 2021-09-10
    • 2015-02-18
    • 2016-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多