【问题标题】:How does memcpy works with void pointers?memcpy 如何处理 void 指针?
【发布时间】:2016-09-30 04:57:20
【问题描述】:

我正在尝试从一个 ptr 到另一个 ptr 的 memcpy。我知道我要复制的尺寸。目标指针和源指针都是 void 指针。这是有效的吗?它实际上是否将 ELEMENT_SIZE(如 128 的整数)从源复制到目标?我知道这不是最理想的做法。但我想知道这是否有效。

memcpy(to_add, element_ptr, ELEMENT_SIZE);

【问题讨论】:

  • 是的,它有效。它的行为与在该字节数上循环字符指针相同。
  • 考虑到 memcpy 被定义为接受 void 指针,您为什么认为它不起作用?
  • 试一试。如果它不起作用,您希望它起作用,请通过minimal reproducible example 回到 SO。

标签: c memcpy


【解决方案1】:

它是否真的从源代码中复制了 ELEMENT_SIZE(整数,如 128) 到目的地?

是的,如果您知道尺寸信息,那么它工作正常。

查看参考链接:http://www.cplusplus.com/reference/cstring/memcpy/

【讨论】:

    【解决方案2】:

    文档中memcpy 的参数说明:

    void * memcpy ( void * destination, const void * source, size_t num );

    destination:指向要复制内容的目标数组的指针, 类型转换为 void* 类型的指针。

    source:指向要复制的数据源的指针,类型转换为 const void* 类型的指针。

    num:要复制的字节数。 size_t 是无符号整数类型。

    memcpy 只是从地址source 开始获取num 字节并将它们复制到地址destination 开始的内存中。

    指针是固定长度的内存地址,与类型无关。不管指针是char *(指向字符数据)、int *(指向整数数据)还是void *(指向未知类型的数据),它仍然只是指向内存。

    因为memcpy复制了明确的字节数,所以指向的数据类型无关紧要;它只需要数据的内存地址。

    【讨论】:

      【解决方案3】:

      它实际上是什么指针并不重要。这是一个非常简单的过程,拥有两个内存地址并进行副本。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-24
        • 1970-01-01
        • 2014-06-01
        • 1970-01-01
        • 2014-12-15
        • 1970-01-01
        • 2014-05-30
        相关资源
        最近更新 更多