找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2038|回复: 0
打印 上一主题 下一主题
收起左侧

STM32中的memcpy函数的使用

[复制链接]
跳转到指定楼层
楼主
ID:55476 发表于 2020-8-24 19:57 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
1 简述
     最近在用JY61做一个倾角项目。刚好商家那里有个示例代码有写这个函数。正好给大家讲下这个函数是怎么用的。





上面这个图呢,是我从商家那里截取出来的。什么意思呢我下面给大家讲下。

2 memcpy定义是什么?
       memcpy 函数用于 把资源内存(src所指向的内存区域) 拷贝到目标内存(dest所指向的内存区域);拷贝多少个?有一个size变量控制拷贝的字节数;

函数原型:void *memcpy(void *dest, void *src, unsigned int count);

      简单来说呢就是把void *src内的数据复制到void *dest里面。unsigned int count这个的意思就是说要从void *src复制多少个字节的数据到void *dest。

3 用法
      可以拷贝任何类型的对象,因为函数的参数类型是void*(未定义类型指针),也就是说传进去的实参可以是int*,short*,char*等等,但是由于函数拷贝的过程是一个字节一个字节的拷贝的,所以实际操作的时候要把void*强制转化为char*,这样在指针加的时候才会保证每次加一个字节

4 实际应用示例
[backcolor=inherit !important]void *[backcolor=inherit !important]memcpy1[backcolor=inherit !important]([backcolor=inherit !important]void *desc[backcolor=inherit !important],[backcolor=inherit !important]const [backcolor=inherit !important]void * src[backcolor=inherit !important],size_t size[backcolor=inherit !important])[backcolor=inherit !important]{ [backcolor=inherit !important]if[backcolor=inherit !important]([backcolor=inherit !important](desc == [backcolor=inherit !important]NULL[backcolor=inherit !important]) && [backcolor=inherit !important](src == [backcolor=inherit !important]NULL[backcolor=inherit !important])[backcolor=inherit !important])[backcolor=inherit !important]//判断desc和src是不是空的。 [backcolor=inherit !important]{  [backcolor=inherit !important]return [backcolor=inherit !important]NULL[backcolor=inherit !important]; [backcolor=inherit !important]} [backcolor=inherit !important]unsigned [backcolor=inherit !important]char *desc1 = [backcolor=inherit !important]([backcolor=inherit !important]unsigned [backcolor=inherit !important]char*[backcolor=inherit !important])desc[backcolor=inherit !important]; [backcolor=inherit !important]unsigned [backcolor=inherit !important]char *src1 = [backcolor=inherit !important]([backcolor=inherit !important]unsigned [backcolor=inherit !important]char*[backcolor=inherit !important])src[backcolor=inherit !important]; [backcolor=inherit !important]while[backcolor=inherit !important](size-- >[backcolor=inherit !important]0[backcolor=inherit !important]) [backcolor=inherit !important]{  *desc1 = *src1[backcolor=inherit !important];  desc1++[backcolor=inherit !important];  src1++[backcolor=inherit !important]; [backcolor=inherit !important]} [backcolor=inherit !important]return desc[backcolor=inherit !important];[backcolor=inherit !important]}[backcolor=inherit !important]int [backcolor=inherit !important]_tmain[backcolor=inherit !important]([backcolor=inherit !important]int argc[backcolor=inherit !important], _TCHAR* argv[backcolor=inherit !important][[backcolor=inherit !important]][backcolor=inherit !important])[backcolor=inherit !important]{ [backcolor=inherit !important]int dest[backcolor=inherit !important][[backcolor=inherit !important]2[backcolor=inherit !important]] = [backcolor=inherit !important]{[backcolor=inherit !important]0[backcolor=inherit !important]}[backcolor=inherit !important]; [backcolor=inherit !important]const [backcolor=inherit !important]char src[backcolor=inherit !important][[backcolor=inherit !important]5[backcolor=inherit !important]] = [backcolor=inherit !important]"1234"[backcolor=inherit !important]; [backcolor=inherit !important]//printf(src); [backcolor=inherit !important]memcpy1[backcolor=inherit !important](dest[backcolor=inherit !important],src[backcolor=inherit !important],[backcolor=inherit !important]sizeof[backcolor=inherit !important](src[backcolor=inherit !important])[backcolor=inherit !important])[backcolor=inherit !important]; [backcolor=inherit !important]//*(dest+5) = '/0'; [backcolor=inherit !important]printf[backcolor=inherit !important]([backcolor=inherit !important]([backcolor=inherit !important]char *[backcolor=inherit !important])dest[backcolor=inherit !important])[backcolor=inherit !important]; [backcolor=inherit !important]int m = -[backcolor=inherit !important]1[backcolor=inherit !important]; [backcolor=inherit !important]return [backcolor=inherit !important]0[backcolor=inherit !important];[backcolor=inherit !important]}
5注意事项
     (1)void* 一定要返回一个值(指针),这个和void不太一样

     (2)首先要判断指针的值不能为空,desc为空的话肯定不能拷贝内存空间,src为空相当于          没有拷贝;所以之间return掉;

    (3)""空串是指内容为0,NULL是0,不是串;两个不等价;

    (4)int dest[2] = {0};这是对int 类型的数组初始化的方法;如果是char类型,就用char a[5] = "1234";  注意数组下标要 多于实际看到的字符数,因为还有'/0'

   (5)printf((char *)dest);这句话,是把 char 类型 src 传到 int 类型的 dest的内存强制转化成char类型,然后打印出来 因为直接看int类型的dest是看不到里面的内容的;因为有unsigned char *desc1 = (unsigned char*)desc;所以字符可以传到dest里面保存起来,dest所指向的内存长度4个字节,强制转化为char 就是把四个字节分成一个一个的字节,这样就可以看到一个个字符了,如果定义成char dest[5] = "1234";就不用转化;

   (6)memcpy1(dest,src,sizeof(src));注意里面的sizeof(src),这个是包括字符串的结束符'/0'的;所以不用担心printf(dest);但是如果用memcpy1(dest,src,4);没有'/0'就要*(dest+5) = '/0';这样保证是一个完整的字符串;

   (7)如果初始化的时候:

char dest[1024] = "12345666";//{0};

const char src[5] = "3333";

           那么拷贝的时候,如果用memcpy1(dest,src,sizeof(src));则printf(dest);出来是333;  如果memcpy1(dest,src,4);则printf(dest);出来是33335666;因为上面的sizeof(src),包含'/0',所以拷贝过去的字符串以'/0' 结束,就只有3333,而如果传4个字符,'/0'是第五个字符,那就遇到dest[1024] 的'/0'结束,所以是33335666字符串的'/0'问题一定要注意啊!!!

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表