【问题标题】:Copying data using memcpy使用 memcpy 复制数据
【发布时间】:2011-02-16 11:40:54
【问题描述】:

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

【问题讨论】:

    标签: c memcpy


    【解决方案1】:

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

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

    【讨论】:

    • 确实存在类型不匹配。对提问者的另一个建议是始终记住使用此 _ptr 名称后缀作为指针。当名称不清楚时,您会忘记什么是指针,什么不是。
    猜你喜欢
    • 2012-07-13
    • 2016-05-10
    • 1970-01-01
    • 2015-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    • 2020-04-22
    相关资源
    最近更新 更多