将值赋给在结构中启动的二维数组会导致无限循环 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·兰金:好的,谢谢!增加了你的推荐信。第二期的推荐很好。你帮了我很多,非常好的建议。谢谢。第二期的推荐很好。你帮了我很多,非常好的建议。谢谢。