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

C语言如何让main函数中初始化的2D数组可被其他函数访问

C语言井字棋棋盘跨函数访问问题解决方案

核心问题根因

  • C语言原生不支持Java的public/private类成员访问修饰符,你自定义的#define public是空宏,不会改变变量作用域。
  • 你把board二维数组、base变量定义在main函数内部,属于函数局部变量,作用域仅限main函数范围,updateBoard作为外部函数无法直接访问。
  • 现有代码还存在两个语法问题:
    • 调用updateBoard时传入了&turn(int指针类型),但函数形参定义为int a,类型不匹配
    • updateBoard函数定义在调用点之后,未提前声明,会触发隐式声明错误

解决方案1:全局变量实现(改造成本最低)

将需要跨函数访问的board、base移动到全局作用域,修改后代码如下:

#include <stdio.h>
#include <stdlib.h>

// 这三个宏在C中没有实际作用,可保留可删除
#define public
#define static
#define private static

// 移到全局作用域,所有函数都可以访问
char board[5][8] = { "  |  |  ", "--+--+--", "  |  |  ", "--+--+--", "  |  |  " };
int base = 0;

// 提前声明函数
void updateBoard(int a);

int main(void) {
    int turn = 0;

    for (size_t row = 0; row < sizeof(board) / sizeof(board[0]); row++) {
        for (size_t col = 0; col < sizeof(board[0]) / sizeof(board[0][0]); col++)
            printf("%c", board[row][col]);
        printf("\n");
    }

    printf("Player1's turn\n ");
    fflush(stdout);
    scanf("%i", &turn);
    // 直接传turn的值,不需要取地址
    updateBoard(turn);
    return 0;
}

void updateBoard(int a){
    switch (a) {
        case 1:
            board[0][0] = 'X';
            break;
        case 2:
            board[0][4] = 'X';
            break;
        case 3:
            board[0][6] = 'X';
            break;
        case 4:
            board[2][0] = 'X';
            break;
        case 5:
            board[2][4] = 'X';
            break;
        case 6:
            board[2][6] = 'X';
            break;
        case 7:
            board[4][0] = 'X';
            break;
        case 8:
            board[4][4] = 'X';
            break;
        case 9:
            board[4][6] = 'X';
            break;
        default:
            printf("Please input a correct value (1-9)\n");
            return;
    }

    for (size_t row = 0; row < sizeof(board) / sizeof(board[0]); row++) {
        for (size_t col = 0; col < sizeof(board[0]) / sizeof(board[0][0]); col++)
            printf("%c", board[row][col]);
        printf("\n");
    }

    base = 1;
}

解决方案2:参数传递实现(更规范,避免全局变量污染)

将board、base作为参数传递给updateBoard,不需要修改变量作用域:

#include <stdio.h>
#include <stdlib.h>

#define public
#define static
#define private static

// 提前声明函数,二维数组传参需要指定第二维长度
void updateBoard(int a, char board[5][8], int* base);

int main(void) {
    char board[5][8] = { "  |  |  ", "--+--+--", "  |  |  ", "--+--+--", "  |  |  " };
    int turn = 0;
    int base = 0;

    for (size_t row = 0; row < sizeof(board) / sizeof(board[0]); row++) {
        for (size_t col = 0; col < sizeof(board[0]) / sizeof(board[0][0]); col++)
            printf("%c", board[row][col]);
        printf("\n");
    }

    printf("Player1's turn\n ");
    fflush(stdout);
    scanf("%i", &turn);
    // 传board数组、base的地址(用于修改原变量)
    updateBoard(turn, board, &base);
    return 0;
}

void updateBoard(int a, char board[5][8], int* base){
    switch (a) {
        case 1:
            board[0][0] = 'X';
            break;
        case 2:
            board[0][4] = 'X';
            break;
        case 3:
            board[0][6] = 'X';
            break;
        case 4:
            board[2][0] = 'X';
            break;
        case 5:
            board[2][4] = 'X';
            break;
        case 6:
            board[2][6] = 'X';
            break;
        case 7:
            board[4][0] = 'X';
            break;
        case 8:
            board[4][4] = 'X';
            break;
        case 9:
            board[4][6] = 'X';
            break;
        default:
            printf("Please input a correct value (1-9)\n");
            return;
    }

    for (size_t row = 0; row < 5; row++) {
        for (size_t col = 0; col < 8; col++)
            printf("%c", board[row][col]);
        printf("\n");
    }

    *base = 1;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 09:30:03