我正在为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是结构分类器的一个实例
答案 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));
}
这将捕获类型错误。我为其中任何一次或两次复制的结构制作其中一个。