使用memcpy复制数据

时间:2011-02-16 11:40:54

标签: c memcpy

我正在为upclsf做一个clsf_ptr的memcpy

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 个答案:

答案 0 :(得分:4)

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

这将捕获类型错误。我为其中任何一次或两次复制的结构制作其中一个。