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