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



我需要创建一个程序,在一个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,随着程序的发展,分配将继续存在。

相关内容

  • 没有找到相关文章