关于C中memmove实现的问题

tom*_*Awa 0 c libc 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;
}
Run Code Online (Sandbox Code Playgroud)

比较字符串dands<运算符有什么作用?根据我的理解,当你比较 C 中的两个字符串时,你倾向于使用类似strcmp(). 它只是比较dand的第一个字符s,还是查看整个字符串?

Fre*_*son 5

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

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

编辑(感谢 Eric Postpischill):

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