Копирование данных с использованием memcpy - PullRequest
1 голос
/ 16 февраля 2011

Я делаю memcpy из clsf_ptr для upclsf

memcpy(&upclsf, &clsf_ptr, sizeof(struct classifier));

во время отладки с использованием GDB я проверил адрес памяти upclsf когда я напечатал & upclsf я получил

(gdb) p &upclsf
$1 = (struct classifier **) 0xbffff184

когда я печатал upclsf, я получил

(gdb) p upclsf
$2 = (struct classifier *) 0x2e312e31

это адрес, который я здесь не могу понять, здесь upclsf является экземпляром классификатора структуры

1 Ответ

4 голосов
/ 16 февраля 2011

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));
}

Это отлавливает ошибки типа.Я делаю один из них для любой структуры, которую копирую более одного или двух раз.

...