我删除结构条目的代码没有删除,我不明白为什么

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 个字符。我比较确定你只需要一个字符,或者更好的是,一个枚举值来存储一种颜色或一块。这首先消除了对数组的需求。