使用 memcpy 复制数据

标签 c memcpy

我正在做 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/

相关文章:

c++ - -O0 、-O1 和 -g 有什么区别

c - memcpy 到完全相同的区域安全吗?

c - 如何连接两个包含多个空字符的字符串?

c - memcpy 函数如何运行的解释?

c++ - 在 C++ 中向 char* 添加 char 前缀的最佳方法?

c - c 中 3x3 矩阵转置的函数

c - 关于C中栈分配的问题

c - 结构填充

c - c语言中如何终止程序?

c - 尝试使用 memcpy 复制 char 指针,出现错误