Мой код для удаления записи структуры не удаляется, и я не могу понять, почему - PullRequest
0 голосов
/ 22 декабря 2018

Я сейчас пытаюсь сделать игру в шахматы.Однако я обнаружил ошибку, при которой, если я пытаюсь удалить кусок (когда он убит), программа зависает, а затем завершает свою работу.

Кажется, проблема в функции 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);
    }
}

1 Ответ

0 голосов
/ 22 декабря 2018
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 символа для каждого цвета и кусочка.Я относительно уверен, что вам нужен только один символ или, что лучше, одно значение перечисления, чтобы сохранить цвет или фрагмент.Что в первую очередь исключает необходимость в массивах.

...