我需要创建一个程序,在一个14x14棋盘上玩游戏十六进制。所以我用'-'(我们的空白模式)创建、分配和填充了黑板。
当我尝试打印板的坐标时,我并不总是得到'-',而是一些随机字符。
此外,如果我尝试在createBoard函数上打印数组[I][j],在"board[I][j] = '-';"在它打印tab[8][0]之后,我得到了一个分割错误。
是什么导致了这种情况,我该如何解决它?
我的代码:
#include <stdio.h>
#include <stdlib.h>
char **createBoard()
{
/*Allocates a 14x14 matrix and fills it
*with '-' to create the board.*/
int i, j;
char **board;
board = malloc(14);
if (!board) exit(1);
for (i = 0; i < 14; i++){
board[i] = malloc(14);
if (!board[i]) exit (1);
for (j = 0; j < 14; j++)
board[i][j] = '-';
}
return board;
}
int main()
{
int i, j;
char **board = createBoard();
for (i = 0; i < 14; i++)
for (j = 0; j < 14; j++)
printf("tab[%d][%d]: %cn",i, j, board[i][j]);
return 0;
}
对于初学者来说,为什么不声明一个数组,而不是动态地分配多个一维数组,这是不清楚的。
对于代码,那么这个内存分配
board = malloc(14);
是无效的。你必须写
board = malloc( 14 * sizeof( char * ));
还应该在程序结束前按与其分配相反的顺序释放所有已分配的内存。
请注意,使用命名常量总是比使用幻数更好。至少你可以写
#define N 14
主要前或
const int N = 14.
并在使用幻数14的地方使用变量N
顺便说一下,根据C标准函数,不带参数的main应该声明为
int main( void )
变量*board
是一个指针,但是您只为每个数组元素分配一个字节,这应该是
#define DIM 14
board = malloc(DIM * sizeof *board);
接着是第二次分配
board[i] = malloc(DIM * sizeof **board);
这也允许(a)维度14只在程序中的一个地方硬编码,(b)如果您以后使棋盘的元素成为不同的类型,例如struct
,随着程序的发展,分配将继续存在。