在 C 中填充动态分配的二维字符数组时的奇怪行为

Strange behavior while filling dinamically allocated 2D char array in C

我需要创建一个程序来在 14x14 棋盘上玩 Hex 游戏。 所以我创建、分配并用“-”填充了板(我们的空白空间模式)。
当我尝试打印电路板的坐标时,我并不总是得到“-”,而是一些随机字符。
此外,如果我尝试在 "board[i][j] = '-';" 行之后的 createBoard 函数上打印 array[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]: %c\n",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,随着程序的发展。