memcpy函数的实现

时间:2013-11-15 14:22:05

标签: c memcpy

我看着     http://www.opensource.apple.com/source/xnu/xnu-2050.24.15/libsyscall/wrappers/memcpy.c

并且不理解以下内容:

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-为什么他们有时更喜欢前向复制,有时甚至倒退?

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

从另一端开始,我们不会覆盖我们仍需要复制的内容。当目的地位于源的左侧时,您必须以相反的方向执行此操作。当源和目的地之间没有重叠时,你做什么并不重要。