C语言中如何传递动态大小的二维char数组至函数(生命游戏场景)
解决动态二维游戏板传递到spielRun函数的方案
在C语言中处理动态尺寸的二维数组,你可以用以下几种可行方案来传递生命游戏板:
方案1:传递指向指针的指针 + 尺寸参数
如果游戏板是通过char**动态分配的(先分配行指针,再为每行分配列内存),可以直接将char**、行数和列数一起传入函数,这是最常见的动态二维数组传参方式。
示例代码:
#include <stdio.h> #include <stdlib.h> #include <time.h> // 函数声明:接收游戏板指针、行数、列数 void spielRun(char** board, int rows, int cols); int main() { int rows, cols; printf("输入行数和列数:"); scanf("%d %d", &rows, &cols); // 动态创建二维游戏板 char** board = (char**)malloc(rows * sizeof(char*)); if (board == NULL) { perror("malloc rows failed"); return 1; } srand(time(NULL)); for (int i = 0; i < rows; i++) { board[i] = (char*)malloc(cols * sizeof(char)); if (board[i] == NULL) { perror("malloc cols failed"); // 释放已分配的内存避免泄漏 for (int j = 0; j < i; j++) free(board[j]); free(board); return 1; } // 随机生成存活细胞('X'代表存活,'.'代表死亡) for (int j = 0; j < cols; j++) { board[i][j] = rand() % 2 ? 'X' : '.'; } } // 传递到spielRun处理 spielRun(board, rows, cols); // 释放内存 for (int i = 0; i < rows; i++) free(board[i]); free(board); return 0; } // 函数实现:处理生命游戏逻辑 void spielRun(char** board, int rows, int cols) { // 示例:打印当前游戏板状态 printf("当前游戏板状态:\n"); for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { printf("%c ", board[i][j]); } printf("\n"); } // 此处添加生命游戏核心逻辑:计算下一代细胞存活状态等 }
方案2:用一维数组模拟二维数组
将二维游戏板转换为连续的一维数组,通过i * cols + j的索引公式实现二维位置访问。这种方式内存连续,缓存友好,传参时只需传递数组指针、行数和列数。
示例代码:
#include <stdio.h> #include <stdlib.h> #include <time.h> void spielRun(char* board, int rows, int cols); int main() { int rows, cols; printf("输入行数和列数:"); scanf("%d %d", &rows, &cols); // 动态创建一维数组模拟二维游戏板 char* board = (char*)malloc(rows * cols * sizeof(char)); if (board == NULL) { perror("malloc failed"); return 1; } srand(time(NULL)); for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { // 二维索引转一维 board[i * cols + j] = rand() % 2 ? 'X' : '.'; } } spielRun(board, rows, cols); free(board); return 0; } void spielRun(char* board, int rows, int cols) { printf("当前游戏板状态:\n"); for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { printf("%c ", board[i * cols + j]); } printf("\n"); } // 示例:计算指定位置的存活邻居数量 int target_i = 1, target_j = 1; int neighbor_count = 0; // 遍历8个相邻方向 for (int di = -1; di <= 1; di++) { for (int dj = -1; dj <= 1; dj++) { if (di == 0 && dj == 0) continue; // 跳过自身 int ni = target_i + di; int nj = target_j + dj; if (ni >= 0 && ni < rows && nj >= 0 && nj < cols) { if (board[ni * cols + nj] == 'X') neighbor_count++; } } } printf("位置(%d,%d)的存活邻居数量:%d\n", target_i, target_j, neighbor_count); }
方案3:用结构体封装游戏板
将游戏板的指针、行数、列数封装到一个结构体中,函数只需接收结构体指针,代码更模块化,可读性更强,尤其适合后续扩展游戏板的其他属性。
示例代码:
#include <stdio.h> #include <stdlib.h> #include <time.h> // 定义游戏板结构体 typedef struct { char** cells; int rows; int cols; } GameBoard; void spielRun(GameBoard* board); int main() { GameBoard board; printf("输入行数和列数:"); scanf("%d %d", &board.rows, &board.cols); // 分配结构体中的二维数组 board.cells = (char**)malloc(board.rows * sizeof(char*)); if (board.cells == NULL) { perror("malloc rows failed"); return 1; } srand(time(NULL)); for (int i = 0; i < board.rows; i++) { board.cells[i] = (char*)malloc(board.cols * sizeof(char)); if (board.cells[i] == NULL) { perror("malloc cols failed"); for (int j = 0; j < i; j++) free(board.cells[j]); free(board.cells); return 1; } for (int j = 0; j < board.cols; j++) { board.cells[i][j] = rand() % 2 ? 'X' : '.'; } } spielRun(&board); // 释放内存 for (int i = 0; i < board.rows; i++) free(board.cells[i]); free(board.cells); return 0; } void spielRun(GameBoard* board) { printf("当前游戏板状态:\n"); for (int i = 0; i < board->rows; i++) { for (int j = 0; j < board->cols; j++) { printf("%c ", board->cells[i][j]); } printf("\n"); } // 此处添加生命游戏核心逻辑 }
内容的提问来源于stack exchange,提问作者Enno Mühlbauer
相关产品推荐
相关产品推荐

