我正在做 clsf_ptr 到 upclsf 的 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是结构分类器的一个实例
最佳答案
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));
}
这将捕获类型错误。我为我复制不止一次或两次的任何结构制作了其中一个。
关于使用 memcpy 复制数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5015954/