【问题标题】:memcpy() does not stop copying [duplicate]memcpy() 不会停止复制
【发布时间】:2011-04-05 21:58:29
【问题描述】:

可能重复:
Problem when copying memory

(tuple1 和 tuple2 是传递给这个函数的 void 指针)

char *data;

data = (char*) calloc (84, 1);

memcpy(data, tuple1, 44);

memcpy(data+44, tuple2, 40);

我为数据分配了 84 个字节。我正在做第一个内存复制 memcpy(data, tuple1, 44);它将 tuple1 的地址中的 44 个字节复制到数据的地址,当我尝试读取数据时,结果发现它已将 tuple1 的字节复制到数据的前 44 个字节上,然后再次复制了 tuple1 的 44 个字节直到它填满了分配给数据的 84 个字节。

当我进行第二次内存复制时,我尝试将 tuple2 的 40 个字节粘贴到数据地址之后的 44 个字节。实际上,它的作用与 tuple1 相同,甚至更多 - 它从数据地址开始粘贴,而不是从数据地址后的 44 个字节开始粘贴。

这是为什么?!我该如何预防呢?任何人都可以帮助,我很绝望。

【问题讨论】:

标签: c memcpy


【解决方案1】:

tuple1tuple2的定义是什么?它们至少是 44 号和 40 号(分别)吗?他们可能指向与data 相同的内存吗?

【讨论】:

    【解决方案2】:

    如果您将数据视为字符串,则可能缺少空终止符。

    您已使用 calloc 将内存初始化为零,但如果您已覆盖每个字节,则没有任何剩余可终止字符串。

    【讨论】:

    • memcpy 不依赖空终止符
    • 我知道。我的意思是在复制之后,他是否期待一个以空字符结尾的字符串?
    【解决方案3】:

    你应该使用地址。

    memcpy(&data, &tuple1, 44);
    
    memcpy(&data+44, &tuple2, 40);
    

    可能有帮助。

    【讨论】:

    • 嗯,没有。首先,这看起来像是猜测。其次,这样猜测是危险的。第三,datatuple1tuple2 已经是指针。您的代码正在尝试将写入这些指针及以后。哎呀!
    • 呃,我只看了最后两行,没有看到 *. tomalak 是对的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 2013-02-03
    相关资源
    最近更新 更多