GDB не согласен - upclsf
это не struct classifier
, это указатель.Обратите внимание, что два ответа имеют разные типы.Первый (&upclsf
) - struct classifier **
, второй (upclsf
) - struct classifier *
.Вот схема памяти:
addr 0xbffff184 / upclsf: pointer to 0x2e312e31
addr 0x2e312e31 / *upclsf: (structure data)
Вы хотите изменить memcpy
на:
memcpy(upclsf, &clsf_ptr, sizeof(struct classifier));
Или, возможно:
memcpy(upclsf, clsf_ptr, sizeof(struct classifier));
Обратите внимание, что memcpy
будет уничтожать данные бессмысленно и не является типобезопасным!Поэтому вы должны быть особенно осторожны, когда используете его, чтобы убедиться, что типы, которые вы даете, правильные.Я предлагаю определить следующую функцию:
static inline void
classifier_copy(struct classifier *dest, struct classifier const *src)
{
memcpy(dest, src, sizeof(*dest));
}
Это отлавливает ошибки типа.Я делаю один из них для любой структуры, которую копирую более одного или двух раз.