c - 关于 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 的第一个字符d
,s
还是查看整个字符串?
解决方案
如果比较指针,实际上是在比较指针地址。if (d < s)
从字面上判断是否d
指向比 . 更低的内存地址s
。
它这样做是为了处理重叠的内存范围。如果d
在内存中指向高于 ,s
则从低到高复制可能最终会破坏尚未复制的字节。因此,在这种情况下,该函数将字节从高位复制到低位。
编辑(感谢 Eric Postpischill):
应该注意的是,此代码适用于可以依赖特定编译器属性的库代码,但不适用于严格符合 C 代码,因为 C 标准没有定义将<
指针应用于不属于相同的数组(或超出它的数组,并将单个对象计为一个元素的数组)。
推荐阅读
- delphi - 如何将复选框更改为纯色并在 Delphi 中更改其边框颜色
- android - kotlin 语法变为 viewBinding
- google-sheets - 将单个单元格排列到 Google 表格中的整个列
- html - 访问模板中的vue环境变量
- c++ - 使用两个线程写入文件
- ios - dyld:库未加载:@rpath/AgoraAIDenoiseExtension.framework/AgoraAIDenoiseExtension 引用自
- node.js - 如何在更改 url 时保持套接字连接处于活动状态
- python - 如何从 Python 中的大图像中提取重叠块?
- assembly - 汇编中的移位字符
- vb6 - vb6 - 发送字节,接收端从 0 到 255