将值赋给在结构中启动的二维数组会导致无限循环 typedef结构游戏{ char gameBoard[行][列]; }游戏; 游戏*Create(){ Game*thegame=(Game*)malloc(sizeof(Game*)); 如果(thegame==NULL | | | | historySize

将值赋给在结构中启动的二维数组会导致无限循环 typedef结构游戏{ char gameBoard[行][列]; }游戏; 游戏*Create(){ Game*thegame=(Game*)malloc(sizeof(Game*)); 如果(thegame==NULL | | | | historySize,c,struct,C,Struct,语句Game*thegame=(Game*)malloc(sizeof(Game*))肯定是错误的;再加上thegame->gameBoard[row][col]=EMPTY_ENTRY,它引入了未定义的行为,因为您访问了未分配的内存。所以您应该编写Game*thegame=malloc sizeof(Game))取而代之。请注意,在C中,最好不要像所说的那样强制转换malloc的结果 无论如何,如果EMPTY\u条目被定义为值0,您也可以使用calloc,它使用0初始化内存。因此您可以省略fo

语句
Game*thegame=(Game*)malloc(sizeof(Game*))
肯定是错误的;再加上
thegame->gameBoard[row][col]=EMPTY_ENTRY
,它引入了未定义的行为,因为您访问了未分配的内存。所以您应该编写
Game*thegame=malloc sizeof(Game))
取而代之。请注意,在C中,最好不要像所说的那样强制转换malloc的结果

无论如何,如果
EMPTY\u条目
被定义为值
0
,您也可以使用
calloc
,它使用
0
初始化内存。因此您可以省略
for
-循环(cf.):

void*calloc(size\t num,size\t size);
为数组分配内存 大小为
size
num
对象,并初始化分配的 存储到零


语句
Game*thegame=(Game*)malloc(sizeof(Game*)
肯定是错误的;再加上
thegame->gameBoard[row][col]=EMPTY_ENTRY
,当您访问未分配的内存时,它引入了未定义的行为。因此您应该编写
Game*thegame=malloc(sizeof(Game))
取而代之。请注意,在C中,最好不要像所说的那样强制转换malloc的结果

无论如何,如果
EMPTY\u条目
被定义为值
0
,您也可以使用
calloc
,它使用
0
初始化内存。因此您可以省略
for
-循环(cf.):

void*calloc(size\t num,size\t size);
为数组分配内存 大小为
size
num
对象,并初始化分配的 存储到零


该函数有两个问题

首先是这个声明

typedef struct game_t {
    char gameBoard[ROWS][COLUMNS];
} Game;


Game* Create(){
    Game *thegame = (Game *)malloc(sizeof(Game*));
    if (thegame==NULL || historySize<=0){
        return NULL;
    }
    int row=0, col=0;
    for (row = 0; row<ROWS; row++){
        for (col = 0; col<COLUMNS; col++){
            thegame->gameBoard[row][col] = EMPTY_ENTRY;
        }
    }
    return thegame;
}
分配大小等于指针大小的内存
Game*
,而不是分配大小等于相同的结构
Game
struct Game\u t
的内存

你必须写作

Game *thegame = (Game *)malloc(sizeof(Game*));

第二个问题是,当变量
historySize
小于或等于0时,可能会出现内存泄漏

考虑到最好将函数参数指定为
void

函数定义可以如下所示

Game *thegame = (Game *)malloc(sizeof(struct game_t));
在这种情况下,可以像这样调用函数

Game * Create( int  historySize )
{
    Game *thegame = NULL;

    if ( historySize > 0 && ( thegame = malloc( sizeof( Game ) ) ) != NULL )
    { 
        for ( int row = 0; row < ROWS; row++ )
        {
            for ( int col = 0; col < COLUMNS; col++ )
            {
                thegame->gameBoard[row][col] = EMPTY_ENTRY;
            }
        }
    }

    return thegame;
}
可以用循环代替标准函数
memset
的调用

比如说

Create( historySize );
#包括
//...
游戏*创建(int historySize)
{
Game*thegame=NULL;
如果(historySize>0&&(thegame=malloc(sizeof(Game)))!=NULL)
{
memset(thegame->gameBoard,空_条目,行*列);
}
返回游戏;
}

该函数有两个问题

首先是这个声明

typedef struct game_t {
    char gameBoard[ROWS][COLUMNS];
} Game;


Game* Create(){
    Game *thegame = (Game *)malloc(sizeof(Game*));
    if (thegame==NULL || historySize<=0){
        return NULL;
    }
    int row=0, col=0;
    for (row = 0; row<ROWS; row++){
        for (col = 0; col<COLUMNS; col++){
            thegame->gameBoard[row][col] = EMPTY_ENTRY;
        }
    }
    return thegame;
}
分配大小等于指针大小的内存
Game*
,而不是分配大小等于相同的结构
Game
struct Game\u t
的内存

你必须写作

Game *thegame = (Game *)malloc(sizeof(Game*));

第二个问题是,当变量
historySize
小于或等于0时,可能会出现内存泄漏

考虑到最好将函数参数指定为
void

函数定义可以如下所示

Game *thegame = (Game *)malloc(sizeof(struct game_t));
在这种情况下,可以像这样调用函数

Game * Create( int  historySize )
{
    Game *thegame = NULL;

    if ( historySize > 0 && ( thegame = malloc( sizeof( Game ) ) ) != NULL )
    { 
        for ( int row = 0; row < ROWS; row++ )
        {
            for ( int col = 0; col < COLUMNS; col++ )
            {
                thegame->gameBoard[row][col] = EMPTY_ENTRY;
            }
        }
    }

    return thegame;
}
可以用循环代替标准函数
memset
的调用

比如说

Create( historySize );
#包括
//...
游戏*创建(int historySize)
{
Game*thegame=NULL;
如果(historySize>0&&(thegame=malloc(sizeof(Game)))!=NULL)
{
memset(thegame->gameBoard,空_条目,行*列);
}
返回游戏;
}

定义了
的位置?您如何知道循环是什么?在循环中使用printf进行确认也可以使用
sizeof(*游戏)
.Fyi,在分配之前应该先检查
historySize
,因为如果成功分配,这会导致内存泄漏,但是
historySize Do sizeof(游戏)不是它的指针在哪里定义了
?你如何知道它是循环?在循环中使用printf确认它也可以使用
sizeof(*游戏)
.Fyi,在分配之前应该先检查
historySize
,因为如果成功分配,这会导致内存泄漏,但是
historySize Do sizeof(游戏)不是它的指针
malloc
(或
calloc
realloc
)的返回值始终值得注意是不必要的。请参阅原始问题评论中的链接。(我怀疑您已经知道,您的加入很可能是由于简单的复制/粘贴,但在回答时,最好将其清理干净。)@David C.Rankin:对,谢谢!添加了您的参考。始终值得注意的是
malloc
return的演员阵容(或
calloc
realloc
)是不必要的。请参阅原始问题评论中的链接。(我怀疑您已经知道了这一点,并且您的加入很可能是由于简单的复制/粘贴,但在回答时,最好将其清除。)@大卫·C·兰金:好的,谢谢!增加了你的推荐信。第二期的推荐很好。你帮了我很多,非常好的建议。谢谢。第二期的推荐很好。你帮了我很多,非常好的建议。谢谢。