首页 文章

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

提问于
浏览
0

我已经在网站上呆了几个小时了,我阅读了很多新技术和编程定义的函数,但我仍然对如何将它应用到我自己的程序感到困惑 . 我试着慢慢开始构建一个跳棋游戏 . 所以首先我创建了一个创建董事会的功能 . 当然,我研究并发现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

    很高兴您正在阅读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);
    

    虽然你可以这样做,但它会非常混乱 . 因此,您可以只使用 pointer to an array of pointers 而不是创建单独的行 .

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

    我会告诉你如何完成制作你的电路板 .

相关问题