C-(malloc,calloc或静态)函数返回的2d char数组

时间:2018-07-22 08:30:08

标签: c multidimensional-array static malloc

我已经在网站上待了几个小时,并且阅读了许多新技术和已编程的已定义函数,但是对于如何将其应用于自己的程序,我仍然有些困惑。我试图开始缓慢,并建立一个跳棋游戏。因此,我首先创建了一个创建董事会的职能。当然,我研究并阅读到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数组更改为静态会更好吗?

1 个答案:

答案 0 :(得分:0)

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

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

现在到您的棋盘问题上,您想要的是一个数组数组。您可以将棋盘上的每个正方形视为一个独立的角色。假设我们的棋盘有一行。

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.

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