C -(malloc、calloc 或静态)从函数返回的 2d 字符数组
Posted
技术标签:
【中文标题】C -(malloc、calloc 或静态)从函数返回的 2d 字符数组【英文标题】:C - (malloc, calloc, or static) 2d char array returned from function 【发布时间】:2018-12-29 23:48:50 【问题描述】:我已经在这个网站上呆了几个小时了,我阅读了很多新技术和编程定义的函数,但我仍然对如何将它应用到我自己的程序中感到有些困惑。我试图慢慢开始并建立一个跳棋游戏。所以首先我创建了一个函数来创建一个 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 数组更改为静态会更好吗?
【问题讨论】:
4 * sizeof(char)
与 4 * 1
相同。 char Rows[8]="ABCDEFGH";
你没有空间'\0'
尝试理解This DEMO
问题不清楚吗?
【参考方案1】:
很高兴您正在阅读 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.
我会让你弄清楚如何完成你的电路板。
【讨论】:
那么如何访问或修改其中的一行? @卡森 上面的棋盘格是一个char *数组。索引到棋盘格会给你一个 char *,你也可以索引到它。以上是关于C -(malloc、calloc 或静态)从函数返回的 2d 字符数组的主要内容,如果未能解决你的问题,请参考以下文章