并且不理解以下内容:
1-
里面
void * memcpy(void *dst0, const void *src0, size_t length) {
char *dst = dst0;
const char *src = src0;
行:
if ((unsigned long)dst < (unsigned long)src) {
我们如何将dst转换为无符号长?它是一个指针!
2-为什么他们有时更喜欢前向复制,有时甚至倒退?
答案 0 :(得分:4)
你是对的,这个实现是不可移植的,因为假设一个指针适合unsigned long
。标准不保证这一点。
此实现的正确类型为uintptr_t
,保证适合指针。
答案 1 :(得分:1)
比较void*
和char*
指针时,编译器会发出警告(gcc -Wall
):
warning: comparison of distinct pointer types lacks a cast
我想开发人员决定“让警告消失” - 但正确的做法是使用void*
演员(可移植):
if((void*) dst < (void*) src) {
关于第二点 - 正如所指出的那样,你必须处理重叠的内存位置。想象一下连续内存位置中的以下8个字符:
abcdefgh
现在我们要将此“3”复制到右侧。从a开始,我们会得到(从左到右的副本):
abcdefgh
abcaefgh
^
abcabfgh
^^
abcabcgh
^^^
等,直到你最终
abcabcabcab
^^^^^^^^
当我们想要
时abcabcdefgh
从另一端开始,我们不会覆盖我们仍需要复制的内容。当目的地位于源的左侧时,您必须以相反的方向执行此操作。当源和目的地之间没有重叠时,你做什么并不重要。