我目前正在尝试下棋游戏。但是,我发现了一个错误,即如果我尝试删除一个片段(当它被杀死时),程序将冻结然后退出。
问题似乎出在DeletePiece函数中。我可以通过在代码中移动printf来弄清楚这一点,直到可以查明它的中断位置。一旦我尝试释放某些东西,它就会冻结。
typedef struct {
char *color;
char *piece;
} PIECE;
PIECE *createPiece(char *color,char *piece) {
PIECE *p=malloc(sizeof(PIECE));
if(p==NULL) {
printf("The memory allocation failed");
return NULL;
}
else {
p->color=malloc(2*sizeof(unsigned char));
p->color=color;
printf("piece is: %c \n",p->color[0]);
p->piece=malloc(2*sizeof(unsigned char));
p->piece=piece;
}
}
PIECE *deletePiece(PIECE *p) {
if(p!=NULL) {
assert(p);
assert(p->piece);
assert(p->color);
free(p->color);
free(p->piece);
p->color=NULL;
p->piece=NULL;
free(p);
}
}
答案 0 :(得分:1)
p->color=malloc(2*sizeof(unsigned char));
p->color=color;
这没有按照您认为的去做。第一行在内存中分配一些空间,并将其地址存储在p->color
中;第二行用另一个地址覆盖p->color
。由于您丢失了地址,因此分配的内存现在也丢失了。
您可能想将color
的内容复制到分配给p->color
的空间中,而您并不需要通过简单的指针分配来实现。此外,如果知道每次都需要多少(2*sizeof(unsigned char)
),为什么还要动态分配内存?只需在您的结构中使用数组即可:
typedef struct {
char color[2];
char piece[2];
} PIECE;
实际上,关于动态分配块可以说相同的话。国际象棋只有32件。不多不少。只需使用一系列的片段:
PIECE pieces[32];
我不明白的另一个要点是,如果没有看到完整的代码,我真的不能说是,每种颜色和每个部分使用2个字符。我相对地确定您只需要一个字符或更佳的一个枚举值即可存储颜色或片段。首先消除了对数组的需求。