C - (malloc、calloc 或静态)从函数返回的二维字符数组

标签 c multidimensional-array static malloc

我已经在这个网站上呆了几个小时了,我阅读了很多新技术和编程定义的函数,但我仍然对如何将它应用到我自己的程序中感到有点困惑。我试图慢慢开始并构建跳棋游戏。所以首先我创建了一个函数来创建一个 Board。当然,我研究并阅读了 C 并不容易让您从函数返回 char 数组。因此,我阅读了有关使用 malloc 或 calloc 进行内存分配的内容。

所以我的第一个错误...

void printBoard(char arr[9][19]);
int makeMove(char arr[11][23], int king, struct player P, char player);
char *createBoard();

char Rows[8]="ABCDEFGH";

int main()
{
    int x, y;
    int isKing = 1;
    char checkerBoard[9][19];

    checkerBoard[9][19] = createBoard();
    printBoard(checkerBoard);
    /* ... */
}

然后……

void printBoard(char array[9][19])
{

    for (int i = 0; i < 9; i++) {
        for (int j = 0; j < 19; j++)
            printf("%c", array[i][j]);
    }
    printf("\n");
};

char * createBoard()
{
    // where I put code

    return  checkerBoard[9][19];
}

我故意遗漏了 createBoard() 中的代码,因为它太多了。因此,当使用 void *malloc(size_t size) 时,我知道我需要指定大小为 4 * sizeof(char) 的字节,但数组的大小不也在那里吗?另外,将 checkerBoard 数组更改为静态会更好吗?

最佳答案

很高兴您正在阅读 C 中的数组。您在问题中提到您读到“C 不允许您轻松地从函数返回数组”。在 C 中,当您在函数内声明一个静态大小的数组时,内存中的该数组存在于堆栈中。每个函数都有自己的堆栈,因此当您从函数返回时,该内存可以再次重用。

当您使用 malloc 和 calloc 分配空间时,就是在堆上分配空间。这是一篇包含更多信息的文章:Stack Vs Heap .

现在开始你的棋盘问题,你想要的是一个数组数组。您可以将棋盘上的每个方 block 视为一个单独的角色。假设我们的棋盘只有一排。

char * row_zero = malloc(sizeof(char) * 15); //row_zero has a length of 15

虽然棋盘显然不止一排,但 9 行呢?

char * row_zero = malloc(sizeof(char) * 15);
char * row_one = malloc(sizeof(char) * 15);
.
.
char * row_eight = malloc(sizeof(char) * 15);

虽然您可以这样做,但它会非常困惑。因此,您无需创建单独的行,只需拥有一个指向指针数组的指针即可。

char ** my_checkerboard = malloc(sizeof(char*) * 9); //has 9 rows.

我会让您弄清楚如何完成您的电路板。

关于C - (malloc、calloc 或静态)从函数返回的二维字符数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51463318/

相关文章:

c - SIGALRM 的处理程序不起作用

c - 如何在 Mac 上使用 C 共享头文件?

c - 2D 数组的输入(-1 表示行结束输入,-2 表示 2D 数组输入结束)问题

java - 在 Java 中使用多维动态数组

c - 评估多项式,使用动态分配的系数数组,我做错了什么?

c - 如何在 C 中正确分配字符串数组中的指针?

c++ - 声明一个没有大小的多维数组

c# - 使用应用程序其他类的 "FindResource"

c - 这个数组是静态的还是动态的?

c - 防止编译器优化静态结构变量