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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 22:25:28