1

我正在做一个 clsf_ptr 的 memcpy 到 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是结构分类器的一个实例

4

1 回答 1

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

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

于 2011-02-16T11:47:45.123 回答