C语言实现memcpy函数的使用示例

 更新时间:2023年09月15日 14:57:06   作者:Dzhuser  
在C语言中,我们可以自己实现 memcpy 函数来实现内存数据的拷贝操作,本文就来介绍一下C语言实现memcpy函数的使用示例,感兴趣的可以了解一下

在 C 语言中,我们可以自己实现 memcpy 函数来实现内存数据的拷贝操作。memcpy 函数用于将指定长度的数据从源地址复制到目标地址。

按字节拷贝实现memcpy

#include <stdio.h>

void* my_memcpy_byte(void* dst, const void* src, int n)
{
    if (dst == NULL || src == NULL || n <= 0)
        return NULL;

    char* pdst = (char*)dst;
    char* psrc = (char*)src;

	//判断目标内存区域和源内存区域是否有重叠
    if (pdst > psrc && pdst < psrc + n) 
    {
    	//如果有重叠,就从尾部开始遍历
        pdst = pdst + n - 1;
        psrc = psrc + n - 1;
        while (n--)
            *pdst-- = *psrc--;
    }
    else
    {
        while (n--)
            *pdst++ = *psrc++;
    }
    return dst;
}

int main(void)
{
    char str[] = "HelloWorld";

    char* str1 = &str[0];
    char* str2 = &str[1];

    my_memcpy_byte(str1, str2, 5);

    printf("%s\n", str); //输出elloWWorld

    return 0;
}

按4字节拷贝实现memcpy

#include <stdio.h>

void* my_memcpy_byte(void* dst, const void* src, int n)
{
    if (dst == NULL || src == NULL || n <= 0)
        return NULL;

    int* pdst = (int*)dst;
    int* psrc = (int*)src;

    char* pdstTemp = NULL;
    char* psrcTemp = NULL;
    int byte4Count = n / 4; //有多少个4字节,按4字节拷贝
    int byteCount = n % 4; //剩余字节数按字节拷贝

    //判断目标内存区域和源内存区域是否有重叠,如果有从后往前,如果没有从前往后
    if (pdst > psrc && pdst < (char*)psrc + n)
    {
        pdstTemp = (char*)pdst + n - 1;
        psrcTemp = (char*)psrc + n - 1;

        while (byteCount--)
        {
            *pdstTemp-- = *psrcTemp--;
        }

        pdstTemp++;
        psrcTemp++;

        pdst = (int*)pdstTemp;
        psrc = (int*)psrcTemp;

        pdst--;
        psrc--;

        while (byte4Count--)
        {
            *pdst-- = *psrc--;
        }

    }
    else
    {
        while (byte4Count--)
        {
            *pdst++ = *psrc++;
        }

        pdstTemp = (char*)pdst;
        psrcTemp = (char*)psrc;

        while (byteCount--)
        {
            *pdstTemp++ = *psrcTemp++;
        }
    }

    return dst;
}

int main(void)
{
    char str[] = "HelloWorld";

    char* str1 = &str[0];
    char* str2 = &str[1];

    my_memcpy_byte(str1, str2, 1);

    printf("%s\n", str);

    return 0;
}

Tips

对比字节拷贝,4字节拷贝速度是提高不少。
但是需要注意,void *dst, const void *src这两个参数是需要按4字节对齐的,如果本身不是4字节对齐,按4字节拷贝效率也会变低。

 到此这篇关于C语言实现memcpy函数的使用示例的文章就介绍到这了,更多相关C语言memcpy函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++中关于this指针的入门介绍

    C++中关于this指针的入门介绍

    this 指针在C++类和对象中是个很方便实用的关键字,可以简化对象成员属性的调用,使代码表达的含义更加准确;在之前的学习中我们都可以判断变量所占内存空间大小,那么我们创建的类对象所占的内存空间怎么计算呢?想知道this的妙用和类对象占用的内存空间就来跟我学习吧
    2022-07-07
  • C语言之整数与浮点数运算的类型转换规则详解

    C语言之整数与浮点数运算的类型转换规则详解

    这篇文章主要介绍了C语言之整数与浮点数运算的类型转换规则,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • C++集体数据交换实现示例讲解

    C++集体数据交换实现示例讲解

    这篇文章主要介绍了C++集体数据交换实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-11-11
  • C语言运算符的优先级与结合性详解及一些错误讲解

    C语言运算符的优先级与结合性详解及一些错误讲解

    C语言的运算符和类型转换是编程的基础,掌握其规则不仅能避免语法错误,更能写出高效、可靠的代码,这篇文章主要介绍了C语言运算符优先级与结合性的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2026-03-03
  • C++编程产生指定范围内的随机数

    C++编程产生指定范围内的随机数

    这篇文章主要为大家详细介绍了C++编程产生指定范围内的随机数,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09
  • QML与C++几种交互方式

    QML与C++几种交互方式

    QML作为构建界面的语言是非常简洁的,但是界面的后台有些时候是经常要与C++交互的,本文主要介绍了QML与C++几种交互方式,感兴趣的可以了解一下
    2024-04-04
  • 基于C++实现掷双骰游戏的示例代码

    基于C++实现掷双骰游戏的示例代码

    在最流行的博彩游戏中有一种名为“掷双骰”(craps)的骰子游戏,这种游戏在世界各地的娱乐场所和大街小巷非常受欢迎。本文将用C++语言实现这一游戏,需要的可以参考一下
    2022-03-03
  • 快速了解C语言静态关键字static的作用

    快速了解C语言静态关键字static的作用

    这篇文章主要介绍了C语言中静态关键字static的作用,对大家学习C语言非常有帮助,有需求的小伙伴可以参考下
    2020-05-05
  • 深入解析C++中的构造函数和析构函数

    深入解析C++中的构造函数和析构函数

    析构函数:在撤销对象占用的内存之前,进行一些操作的函数。析构函数不能被重载,只能有一个
    2013-09-09
  • 源码分析C++是如何实现string的

    源码分析C++是如何实现string的

    我们平时使用C++开发过程中或多或少都会使用std::string,但您了解string具体是如何实现的吗,本文小编就带大家从源码角度分析一下
    2023-04-04

最新评论