memcpy函数用法

article/2025/9/16 17:37:12

各位读者朋友们,由于更新blog不易,如果觉得这篇blog对你有用的话,麻烦关注,点赞,收藏一下哈,十分感谢。
在这里插入图片描述

1、简介

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

1.1 函数原型:

void *memcpy(void *dest, void *src, unsigned int count);

1.2 用法:

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

1.3 函数源码:

void *memcpy1(void *desc,const void * src,size_t size)
{if((desc == NULL) && (src == NULL)){return NULL;}unsigned char *desc1 = (unsigned char*)desc;unsigned char *src1 = (unsigned char*)src;while(size-- >0){*desc1 = *src1;desc1++;src1++;}return desc;
}int _tmain(int argc, _TCHAR* argv[])
{int dest[2] = {0};const char src[5] = "1234";//printf(src);memcpy1(dest,src,sizeof(src));//*(dest+5) = '/0';printf((char *)dest);int m = -1;return 0;
}

1.4 注意事项:

  • void* 一定要返回一个值(指针),这个和void不太一样!
  • 首先要判断指针的值不能为空,desc为空的话肯定不能拷贝内存空间,src为空相当于没有拷贝;所以之间return掉;
  • ""空串是指内容为0,NULL是0,不是串;两个不等价;
  • int dest[2] = {0};这是对int 类型的数组初始化的方法;如果是char类型,就用char a[5] = "1234"; 注意数组下标要多于实际看到的字符数,因为还有’/0’
  • printf((char *)dest);这句话,是把 char 类型 src 传到 int 类型的
    dest的内存强制转化成char类型,然后打印出来; 因为直接看int类型的dest是看不到里面的内容的;因为有unsigned char *desc1 = (unsigned char*)desc;所以字符可以传到dest里面保存起来,dest所指向的内存长度4个字节,强制转化为char 就是把四个字节分成一个一个的字节,这样就可以看到一个个字符了,如果定义成char dest[5] = “1234”;就不用转化;呵呵,表达起来真累人;
  • memcpy1(dest,src,sizeof(src));注意里面的sizeof(src),这个是包括字符串的结束符’/0’的;所以不用担心printf(dest);但是如果用memcpy1(dest,src,4);没有’/0’就要*(dest+5) = '/0';这样保证是一个完整的字符串;
  • 如果初始化的时候:
char dest[1024] = "12345666";//{0};
const char src[5] = "3333";
  • 那么拷贝的时候,如果用memcpy1(dest,src,sizeof(src));printf(dest);出来是3333
  • 如果memcpy1(dest,src,4);printf(dest);出来是33335666;因为上面的sizeof(src),包含’/0’,所以拷贝过去的字符串以’/0’结束,就只有3333,而如果传4个字符,‘/0’是第五个字符,那就遇到dest[1024]
    的’/0’结束,所以是33335666
  • 字符串的’/0’问题一定要注意啊!!!

2 实际应用:

unsigned char g_pData[1024] = "";
DWORD g_dwOffset = 0;
bool PackDatatoServer(const unsigned char *pData, const unsigned int uSize)
{memcpy(g_pData+g_dwOffset, pData, uSize);g_dwOffset += uSize;//g_pData += uSize;return true;
}void main()
{const unsigned char a[4] = "123";PackDatatoServer(a, 3);PackDatatoServer(a, 1111);int b = -1;
}
  • PackDatatoServer()函数的作用是把每次的资源内存拷贝到目标内存里面,而且是累加的拷贝;也就是后一次紧接着上一次的拷贝;显然用到了memcpy函数;
  • 实现原理是用到了一个全局变量g_dwOffset保存之前拷贝的长度,最开始没有想到这一点,结果每次拷贝都是一次性的,下一次拷贝把上一次的冲掉了;所以用全局变量记录拷贝的长度;
  • 第二个需要注意的是,拷贝的过程中注意不要改变目标指针的指向,即目标指针始终指向初始化的时候指向的位置;
  • 那么怎么实现累积拷贝呢?
    • 就是用的指针偏移;第一次实现的时候,把g_pData += uSize;写到了函数里面,这样写是能够实现指针位移的目标,但是指针指向也发生改变;
    • 另外:g_pData += uSize;也有报错:left operand must be l-value,原因是:把地址赋值给一个不可更改的指针!

比如:

char a[100];  
char *p = new char[10];  
a = p; //这里出错,注意了:数组的首地址也是一个常量指针,指向固定不能乱改的~~char* const pp = new char[1];  
pp = a; //也错  

所以既不能改变首地址,又要满足累积赋值(就是赋值的时候要从赋过值的地方开始向下一个内存块赋值,想到指针加),所以想到把指针加写到函数参数里面,这时就要充分了解memcpy的实现过程,里面是一个一个字符的赋值的,想连续赋值,就要把指针指向连续的内存的首地址,所以,
真的很不好表达,呵呵,就这样了,一大推零散的知识。。。
在这里插入图片描述


http://chatgpt.dhexx.cn/article/EvR5DO46.shtml

相关文章

【C库函数】memcpy函数详解

目录 memcpy 函数原型 参数讲解 返回值讲解 函数讲解(三个注意点) memcpy 拷贝内存块到目标空间 函数原型 void *memcpy( void *dest, const void *src, size_t count ); 参数讲解 参数destsrccount解析目标空间地址要拷贝内容空间源地址拷贝内容…

C语言——内存操作函数(memcpy、memmove、memcmp、memset)

文章目录 📘前言📗 一、memcpy(内存拷贝)📖 1. 函数说明📖 2. 模拟实现💡 3. 运行图示: 📗二、memmove📖 1. 函数说明📖 2. 模拟实现💡 3. 运行图…

memcpy函数详解 看这一篇就够了-C语言(函数讲解、 使用用法举例、作用)

memcpy()函数用于:复制内存块 函数介绍 函数声明:void * memcpy ( void * destination, const void * source, size_t num ); 参数 目的地:指向要在其中复制内容的目标数组的指针,类型转换为 void* 类型的指针。 源:指…

智慧校园信息化管理平台技术方案

1.2总体架构设计 智慧校园平台是以学校现有网络为基础,以服务于全校师生的教学、科研、生活为目的,建立在学校数据中心平台之上,涵盖了学校的学校管理、学生管理、教学管理、班级管理、家校共育、教务管理等全方位的管理信息平台与信息服务平…

县域教育信息化优质均衡建设解决方案

项目概述 “人才决定未来,教育成就梦想”。我国一直坚持不懈推进教育信息化,努力以信息化为手段扩大优质教育资源覆盖面。我国规划将通过教育信息化,逐步缩小区域、城乡数字差距,大力促进教育公平,让亿万孩子同在蓝天…

XXX高校数字化校园数据中心建设方案

目录 一、 项目概述 4 1.1建设背景 4 1.2建设目标 5 1.3建设原则 6 1.4云平台技术打造大数据与高性能优势 7 二、 需求分析 9 2.1现状分析 9 2.2总体建设 9 2.2.1XXX高校校园云平台需求 10 2.2.2大数据分析需求 10 2.2.3高性能需求 12 三、 数据中心总体规划 14 四…

智慧教育信息化建设解决方案

建设思路及解决方案 以数据整合、应用融合、服务聚合为目标,充分利用已有的成果,联接全校物联感知设备、构筑智能化安防体系,打造泛在化的学习环境、实现一体化的运维管控,最终形成智慧环境、智慧管理、智慧服务、智慧教学、智慧资…

信息化建设规划_职业院校教育信息化建设发展规划编制培训班圆满落幕!

9月24日至25日,由中国高等教育培训中心主办的职业院校教育信息化建设发展规划编制培训班,在重庆滨乐宝轩酒店盛大举行。会上,来自全国的教育专家、学者齐聚一堂,共同探讨智慧校园建设实现路径,面向与会的百余名教育工作…

如何建设教育信息化评价指标体系?

原创 CERNET 中国教育网络 2020-09-16 在教育信息化生态系统中,有三大推动力量:教育信息化评价指标体系制定、评估工作开展和评估建模分析,这三者相互依赖、相互影响。 01高校信息化建设的现状与问题 自从教育部发布《教育信息化2.0行动计…

某企业运营(集团)有限公司信息化建设规划方案

目录 1. 单位信息化建设现状分析 1.1 网络性能风险 1.2 管理功能风险 1.3 网络安全风险 1.4 数据安全风险 1.5 访问身份识别风险 1.6 信息化支撑环境风险 2. 需求分析 2.1 网络及管理需求分析 2.2 网络安全需求分析 2.3 …

教育信息化2.0建设解决方案

教育强则国家强,教育兴则民族兴。教育不仅关乎个体发展,家庭幸福,而且关乎国家强盛,民族复兴。教育是提高人民综合素质、促进人的全面发展的重要途径,是民族振兴、社会进步的重要基石,是对中华民族伟大复兴…

计算机在校学校目标和措施,学校信息化工作方案

学校信息化工作方案 指导思想: 以学校总体办学思路为指针,贯彻教育局信息中心,从务实、求真出发继续深入开展现代教育技术的普及工作,在积累经验的基础上,努力将信息教学普及化、提升管理使其规范化,加强管…

计算机在校学校目标和措施,学校信息化建设三年发展规划

学校信息化建设三年发展规划 为了加快学校信息化发展,明确学校信息化发展目标、方向和重点,以“科学发展观”为指导思想,依据中小学信息化发展建设的要求,针对我校信息化建设的现状,特制定三年信息化建设发展规划&…

二维正态分布的最大似然估计_最大似然估计-高斯分布

前言:介绍了最简单的 问题 (这里都是玩具数据,为了方便理解才列出) 0123456789101112 X 1 2 3 4 4.2 4.4 4.6 4.8 5 6 7 8 y 0 0 0 0 1 1 1 1 0 0 0 0 假设 x 4.9 用科学的办法估计 y 的分类。 预备知识 高斯分布的概率密度函数 高斯分布的概率密度函数…

极大似然估计详解

极大似然估计 以前多次接触过极大似然估计,但一直都不太明白到底什么原理,最近在看贝叶斯分类,对极大似然估计有了新的认识,总结如下: 贝叶斯决策 首先来看贝叶斯分类,我们都知道经典的贝叶斯公式: 其中:p(w):为先验概率,表示每种类别分布的概率;:类条件概…

【概率论】极大似然估计和最大后验估计

目录 1.前言 2 频率学派和贝叶斯学派 2.1 频率学派 2.2 贝叶斯学派 3. 极大似然估计 3.1 概率和似然 3.2 极大似然原理及求解 3.3 例题 4. 最大后验估计 4.1 最大后验估计原理 5. 参考 1.前言 极大似然估计和最大后验估计都是参数的估计方法,一定要记住&a…

极大似然估计(Maximum Likelihood Estimation)

1.极大似然估计 笔记来源:Maximum Likelihood,clearly explained!! 在日常对话中,我们说的“概率”和“似然”其实是一回事,但在统计领域中,“似然”指的是我们下面要描述的情况,即尝试为所给测量值的分布…

【转载】极大似然估计

原文链接:知行流浪 https://blog.csdn.net/zengxiantao1994/article/details/72787849 以前多次接触过极大似然估计,但一直都不太明白到底什么原理,最近在看贝叶斯分类,对极大似然估计有了新的认识,总结如下&#xff1…

p 型极大似然估计 matlab,最大似然估计的matlab实现

最大似然估计的matlab实现 最大似然估计的matlab实现 实验目的: 在MVU估计量不存在或存在但不能求解的情况下,最大似然估计是获得实用估计的最通用的方法,利用它可简便地实现对复杂的估计问题的求解。对绝大多数实用的最大似然估计&#xff…