You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言编写井字棋程序运行返回退出码-1073741819如何解决

问题原因及修复方案

直接崩溃原因

你遇到的空指针读取异常是由函数调用参数写错直接导致的:
主函数结尾的判断语句if (evaluateWinConditions(board == 1))存在语法错误:

  • board == 1是布尔比较运算,返回值只有0(假)或1(真),你把这个整数值作为指针参数传给了需要接收二维数组的evaluateWinConditions函数
  • 当该值为0时就等价于传入空指针,函数内部访问board[0][0]就会触发空指针读取异常,就是你遇到的报错。

其他隐藏bug

除了上述直接崩溃的问题,你的代码还有多处逻辑错误会导致功能无法正常运行:

  • 玩家2落子的赋值语句写为了判断语句:board[row][column] == 'O'; 双等号是比较运算,不会修改数组值,要改为单等号赋值board[row][column] = 'O';
  • 胜负判定的三连逻辑错误:C语言中a == b == c不是判断三个值相等,而是先计算a==b得到0/1的布尔值,再用这个布尔值和c比较,完全不符合预期,需要改为a == b && b == c的格式
  • 字符比较误用字符串:if (board[0][0] == "X")中双引号包裹的"X"是字符串指针,要比较字符需要用单引号'X'
  • 没有坐标边界校验:按下方向键时row和column会出现小于1或大于3的情况,直接作为数组下标会导致越界访问,另外你的光标坐标是1开始,数组下标是0开始,需要做下标转换
  • 数组初始化错误:char board[3][3] = {{"-"}};中"-"是字符串,要初始化字符应该用单引号'-',且需要初始化所有元素为'-'避免随机值干扰判定

修复后的完整代码

#include <stdio.h>
#include <conio.h>

char evaluateWinConditions(char board[3][3]);

int main(void)
{
    // 初始化棋盘并打印
    char board[3][3];
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            board[i][j] = '-';
        }
        puts("---");
    }

    char key = 0;
    // 光标坐标1开始,数组下标0开始
    int row = 1, column = 1;
    int player = 1;

    printf("\033[%d;%dH", row, column);

    while (evaluateWinConditions(board) == 0) {
        key = _getch();
        switch (key) {
            case 'a':
                if (column > 1) column -= 1;
                break;
            case 'w':
                if (row > 1) row -= 1;
                break;
            case 'd':
                if (column < 3) column += 1;
                break;
            case 's':
                if (row < 3) row += 1;
                break;
            case ' ':
                // 只有空位可以落子
                if (board[row-1][column-1] == '-') {
                    if (player == 1) {
                        printf("%c", 'X');
                        board[row-1][column-1] = 'X';
                        player = 2;
                    }
                    else {
                        printf("%c", 'O');
                        board[row-1][column-1] = '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.");

    _getch();
    return 0;
}

char evaluateWinConditions(char board[3][3])
{
    // 横向三连
    for (int i = 0; i < 3; i++) {
        if (board[i][0] != '-' && board[i][0] == board[i][1] && board[i][1] == board[i][2]) {
            return board[i][0] == 'X' ? 1 : 2;
        }
    }
    // 纵向三连
    for (int j = 0; j < 3; j++) {
        if (board[0][j] != '-' && board[0][j] == board[1][j] && board[1][j] == board[2][j]) {
            return board[0][j] == 'X' ? 1 : 2;
        }
    }
    // 对角线三连
    if (board[0][0] != '-' && board[0][0] == board[1][1] && board[1][1] == board[2][2]) {
        return board[0][0] == 'X' ? 1 : 2;
    }
    if (board[0][2] != '-' && board[0][2] == board[1][1] && board[1][1] == board[2][0]) {
        return board[0][2] == 'X' ? 1 : 2;
    }
    // 无胜者
    return 0;
}

内容的提问来源于stack exchange,提问作者user15194704

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 23:15:01