【问题标题】:Why memmove() function works this way?为什么 memmove() 函数以这种方式工作?
【发布时间】:2018-01-01 21:56:57
【问题描述】:

我在 Stack Overflow 上遇到了与 memmove()memcpy() 相关的各种问题。

有这个帖子暗示如果源地址(要复制的数据)大于目标地址(要复制的数据),它将执行正向复制,否则将执行反向复制。

为什么会这样?我尝试对这两种情况进行正向复制,并且效果很好,没有任何错误。

你能详细说明一下吗?我不明白原因。

编辑:这就是我的意思:

#include <memory.h> 
#include <string.h>
#include <stdio.h>

void *memmoveCustom(void *dest, const void *src, size_t n)
{
    unsigned char *pd = (unsigned char *)dest;
    const unsigned char *ps = (unsigned char *)src;
    if ( ps < pd )
        for (pd += n, ps += n; n--;)
            *--pd = *--ps;
    else
        while(n--)
            *pd++ = *ps++;
    return dest;
}

int main( void )
{
    printf( "The string: %s\n", str1 );

    memmoveCustom( str1 + 1, str1, 9 );
    printf( "Implemented memmove output: %s\n", str1 );

    getchar();
}

以上程序是实现自定义 memmove() 函数的示例代码。 在函数内部,您可以看到当源地址大于目标地址时,它执行正向复制,否则它会将 n-location 添加到现有地址并从反向执行复制。 就是这样。

【问题讨论】:

  • 请链接到您所指的帖子。
  • 您测试的缓冲区是否重叠?因为这是 memmove 的主要目的。
  • it will perform forward copying otherwise it will perform backward copying。这甚至意味着什么?它有时会从地址 0x000 复制到 0xFFF,但有时会从地址 0xFFF 复制到 0x000?为什么需要反向复制?
  • “我尝试对这两种情况进行正向复制,效果非常好,没有任何错误。” --> 显示该代码。也许你得出的“完全没问题”的结论并非如此。
  • “有这个帖子……” - 哪个帖子?该标准没有要求库函数必须如何完成它们的任务。 (而且它通常不像你写的那么简单)。你的问题是什么?好像没有,文档有什么不清楚的地方?

标签: c memmove


【解决方案1】:

如果源地址(要复制的数据)大于目标地址(要复制的数据),则执行正向复制,否则执行反向复制。

这仅在fromto 范围重叠 时才重要。对于非重叠范围,复制方向无关紧要。

重叠范围很重要,因为如果您从头开始复制,您将在复制之前破坏源数据。

【讨论】:

  • 嗯,我感觉向后复制对缓存非常不友好。我说的对吗?
猜你喜欢
  • 2022-11-20
  • 1970-01-01
  • 1970-01-01
  • 2013-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-11
  • 1970-01-01
相关资源
最近更新 更多