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
相关产品推荐
相关产品推荐

