首页 > 解决方案 > 关于 C 中 memmove 实现的问题

问题描述

我是 C 的完全新手,所以这可能是一个愚蠢的问题。

memmove我在网上找到的实现中,代码执行以下操作:

void *memmove(void *dest, const void *src, size_t len) {
  char *d = dest;
  const char *s = src;
  if(d < s) {
    while(len--)
      *d++ = *s++;
  } else {
    ...
  }
  return dest;
}

比较字符串d和运算符s<什么作用?据我了解,当您比较 C 中的两个字符串时,您倾向于使用类似strcmp(). 它只是比较 and 的第一个字符ds还是查看整个字符串?

标签: clibcmemmove

解决方案


如果比较指针,实际上是在比较指针地址。if (d < s)从字面上判断是否d指向比 . 更低的内存地址s

它这样做是为了处理重叠的内存范围。如果d在内存中指向高于 ,s则从低到高复制可能最终会破坏尚未复制的字节。因此,在这种情况下,该函数将字节从高位复制到低位。

编辑(感谢 Eric Postpischill):

应该注意的是,此代码适用于可以依赖特定编译器属性的库代码,但不适用于严格符合 C 代码,因为 C 标准没有定义将<指针应用于不属于相同的数组(或超出它的数组,并将单个对象计为一个元素的数组)。


推荐阅读