关于 C 中 memmove 实现的问题

Question about memmove implementation in C

我是 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;
}

将字符串 ds< 运算符进行比较有何作用?根据我的理解,当你在 C 中比较两个字符串时,你倾向于使用 strcmp() 之类的东西。它只是比较 ds 的第一个字符,还是查看整个字符串?

如果你比较指针,你实际上是在比较指针地址。 if (d < s) 字面上决定 d 是否指向比 s.

更低的内存地址

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

编辑(感谢 Eric Postpischill):

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

memcpy不同,函数memmove允许内存区域重叠,即允许目标区域的一部分成为源区域的一部分。因此,实现必须确保源区域在读取源区域数据之前不会被目标区域数据覆盖。

密码

if(d < s) {

检查目标区域是否在内存中源区域之前。如果是这样,从最低地址开始逐个字符地从源复制到目标是安全的。

换句话说,当比较 d < s 为真时,使用简单的复制循环“移动内存”是安全的:

    while(len--)
       *d++ = *s++;

所以回答你的具体问题,即

Does it just compare the first character of d and s, or does it look at the whole string?

都没有。它不是以任何方式进行的字符串比较。这不是任何方式的字符比较。

代码是比较指向两个区域(即目标区域和源区域)的指针,以确定如何完成内存移动。

编辑:

如许多评论中所述(Andrew Henle,M.M。)C 标准不允许比较指向不同对象的指针(显示的 memmove 代码可能会这样做) .但是,在查看 memove 的具体实现时,该实现是针对特定系统的。因此,尽管代码不严格符合标准,但设计人员知道它实际上可以在系统上运行,它是为...设计的。