📜  编写自己的memcpy()和memmove()(1)

📅  最后修改于: 2023-12-03 14:56:57.757000             🧑  作者: Mango

编写自己的memcpy()和memmove()

在C语言中,memcpy()和memmove()是常用的内存拷贝函数。memcpy()函数是将一段内存块中的数据复制到另一个内存块中,而memmove()函数则是将一段内存块中的数据移动到另一个内存块中。本文将详细介绍如何编写自己的memcpy()和memmove()函数。

memcpy()函数

memcpy()函数的定义如下:

void *memcpy(void *dest, const void *src, size_t n);

其中,dest表示目标内存块的地址,src表示源内存块的地址,n表示要复制的字节数。

要编写自己的memcpy()函数,可以按照以下步骤:

  1. 判断目标内存块是否为空,若为空则返回NULL;
  2. 将源内存块中的数据复制到目标内存块中。

代码实现如下:

void *my_memcpy(void *dest, const void *src, size_t n) {
    if (dest == NULL) {
        return NULL;
    }
    unsigned char *s = (unsigned char *)src;
    unsigned char *d = (unsigned char *)dest;
    for (size_t i = 0; i < n; i++) {
        d[i] = s[i];
    }
    return dest;
}
memmove()函数

memmove()函数的定义如下:

void *memmove(void *dest, const void *src, size_t n);

其中,dest表示目标内存块的地址,src表示源内存块的地址,n表示要移动的字节数。

要编写自己的memmove()函数,可以按照以下步骤:

  1. 判断目标内存块是否为空,若为空则返回NULL;
  2. 判断源内存块与目标内存块是否重叠,若重叠则采用反向复制的方式进行移动;
  3. 将源内存块中的数据移动到目标内存块中。

代码实现如下:

void *my_memmove(void *dest, const void *src, size_t n) {
    if (dest == NULL) {
        return NULL;
    }
    unsigned char *s = (unsigned char *)src;
    unsigned char *d = (unsigned char *)dest;
    if (d <= s || d >= s + n) {
        for (size_t i = 0; i < n; i++) {
            d[i] = s[i];
        }
    } else {
        for (size_t i = n; i != 0; i--) {
            d[i - 1] = s[i - 1];
        }
    }
    return dest;
}

以上就是自己编写memcpy()和memmove()函数的详细介绍,欢迎参考。