我删除结构条目的代码没有删除,我不明白为什么
My code to delete a structure entry does not delete, and I cannot figure out why
我目前正在尝试制作一款国际象棋游戏。但是,我发现了一个错误,如果我尝试删除一个片段(当它被杀死时)程序会冻结然后退出。
问题似乎出在 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);
}
}
p->color=malloc(2*sizeof(unsigned char));
p->color=color;
这不是您认为的那样。第一行在内存中分配一些space并将其地址存储在p->color
中;第二行用另一个地址覆盖 p->color
。由于您丢失了地址,分配的内存现在丢失了。
您可能想将 color
的内容复制到分配给 p->color
的 space 中,而您不会通过简单的指针赋值来做到这一点。另外,如果您知道每次需要多少内存,为什么还要动态分配内存 (2*sizeof(unsigned char)
)?只需在您的结构中使用数组:
typedef struct {
char color[2];
char piece[2];
} PIECE;
实际上,对于动态分配块也可以这样说。国际象棋只有32颗棋子。不多也不少。只需使用一个数组:
PIECE pieces[32];
还有一点我不明白,但如果没有看到您的完整代码我真的无法分辨,就是您为每种颜色和单品使用了 2 个字符。我比较确定你只需要一个字符,或者更好的是,一个枚举值来存储一种颜色或一块。这首先消除了对数组的需求。
我目前正在尝试制作一款国际象棋游戏。但是,我发现了一个错误,如果我尝试删除一个片段(当它被杀死时)程序会冻结然后退出。
问题似乎出在 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);
}
}
p->color=malloc(2*sizeof(unsigned char));
p->color=color;
这不是您认为的那样。第一行在内存中分配一些space并将其地址存储在p->color
中;第二行用另一个地址覆盖 p->color
。由于您丢失了地址,分配的内存现在丢失了。
您可能想将 color
的内容复制到分配给 p->color
的 space 中,而您不会通过简单的指针赋值来做到这一点。另外,如果您知道每次需要多少内存,为什么还要动态分配内存 (2*sizeof(unsigned char)
)?只需在您的结构中使用数组:
typedef struct {
char color[2];
char piece[2];
} PIECE;
实际上,对于动态分配块也可以这样说。国际象棋只有32颗棋子。不多也不少。只需使用一个数组:
PIECE pieces[32];
还有一点我不明白,但如果没有看到您的完整代码我真的无法分辨,就是您为每种颜色和单品使用了 2 个字符。我比较确定你只需要一个字符,或者更好的是,一个枚举值来存储一种颜色或一块。这首先消除了对数组的需求。