我是 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,还是查看整个字符串?
如果比较指针,实际上是在比较指针地址。if (d < s)从字面上看是决定是否d指向比 更低的内存地址s。
这样做是为了处理重叠的内存范围。如果d内存中的指向位置高于s,则从低位向高位复制可能会破坏尚未复制的字节。因此,在这种情况下,该函数将把字节从高位复制到低位。
编辑(感谢 Eric Postpischill):
应该注意的是,此代码对于可以依赖特定编译器属性的库代码来说是可以的,但对于严格符合 C 代码来说是不行的,因为 C 标准没有定义应用于不<属于同一数组(或超出该数组的数组,并将单个对象视为包含一个元素的数组)。