内存操作函数(memcpy,memmove,memset)

2023-05-16

前言:

C 语言中对字符和字符串的处理很是频繁,但是 C 语言本身是没有字符串类型的,字符串通常放在 常量字符串 中或者字符数组 中。 字符串常量 适用于那些对它不做修改的字符串函数。

memcpy

函数 memcpy source 的位置开始向后复制 num 个字节的数据到 destination 的内存位置。 这个函数在遇到 '\0' 的时候并不会停下来。 如果source destination 有任何的重叠,复制的结果都是未定义的。
void *my_memcpy(void *dest,const void *src,size_t count)
{
	assert(dest!=NULL && src!=NULL);
	char *p = (char*)dest;
	char *q = (char*)src;
	while (count--)
	{
		*p = *q;
		p++;
		q++;

	}
	return dest;
}

memcpy和strcpy的区别:strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。strcpy复制如下图所示:

memcpy复制如下图所示:

 memmove

void *my_memmove(void *dest, const void *src, size_t count)
memcpy 的差别就是 memmove 函数处理的源内存块和目标内存块是可以重叠的。 如果源空间和目标空间出现重叠,就得使用memmove 函数处理。
例如对于一个数组arr[]={1,2,3,4,5,6,7,8,9,10},要把1,2,3,4复制arr+2上去,正确的结果是1,2,1,2,3,4,7,8,9,10,但是用 memcpy他的结果如下图所示:1,2,1,2,1,2,7,8,9,10.出现了重叠部分,未能得到理想结果。

 具体原因是把1,2,3,4,5,6,7,8,9,10中前四个数1,2,3,4复制到中间的3,4,5,6的位置时,1替换3,2替换4,3替换5,4替换6,但是此时的3不再是3而是1,4不再是4而是2,被新值覆盖。所以此时从前往后赋值不行,应该从后往前赋值。memmove则是这样实现的。

但是问题是什么时候从前往后赋值,什么时候从后往前赋值?

同样以arr[]={1,2,3,4,5,6,7,8,9,10}为例。

我们想把3,4,5,6赋值到dest的空间里面去,为了不重复覆盖,当dest在3之前时,应该从前到后赋值,当dest在3-6之间时,从后往前赋值,6之后,从前可前往后,后往前赋值。

 memmove自实现:根据上面的分析可以分两种情况分别赋值,当dest在3-6的时候从后往前赋值,当dest不在3-6这个范围的时候,统一从前往后赋值。

void *my_memmove(void *dest, const void *src, size_t count)
{
	assert(dest != NULL&&src != NULL);
	char *des = dest;
	if ((dest>src)&&dest<((char*)src+count))
	{
		while (count--)//后向前
		{
			*((char*)des + count) = *((char*)src + count);
		}
	}
	else
	{
		while (count--)//前向后
		{
			*(char *)des = *(char *)src;
			dest = (char *)des + 1;
			src = (char*)src + 1;
		}
	}
	return dest;


}

memset

void *memset(void *dest,int c,size_t count)

内存设置函数,把目标函数count字节设置为c,例如:

int main()
{
    int arr[] = {1,2,3,4,5,6,7,8,9,10};
    my_memest(arr, 0, 16);
    return 0;
}

 memset自实现:

void *my_memest(void *dest,int c,size_t count)//内存初始化
{
	for (int i = 0; i < count;i++)
	{
		((char*)dest)[i] = c;
	}
	return dest;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

内存操作函数(memcpy,memmove,memset) 的相关文章

  • AC源码

    字符串算法 一级目录 一级目录 下面展示一些 内联代码片 关于aoti函数的实现 xff1a 1 xff1a 空白符 2 xff1a 正号和负号 3 xff1a 关于进制 xff1a 4 xff1a 溢出的问题 xff1b 用到库函数 xf
  • FreeRtos使用注意(基础知识)

    关于中断 NVIC PriorityGroupConfig NVIC PriorityGroup 4 中断优先级设置为0 15级抢占优先级 xff0c 0子优先级 这个也是官方强烈建议的 其中中断优先级0 15级 xff0c 0的优先级是最
  • 【点云数据集】

    点云数据集汇总整理 1 点云分类和分割 1 1 ModelNet40 xff08 点云分类 xff09 普林斯顿 ModelNet 项目的目标是为计算机视觉 计算机图形学 机器人学和认知科学领域的研究人员提供全面 干净的对象 3D CAD
  • ROS下UWB串口数据读取,并以话题的形式发布

    ROS串口读取UWB定位数据 xff0c 以话题的形式发布 include span class token operator lt span ros span class token operator span ros span clas
  • ubuntu环境下启动rosrun rqt_tf_treerqt_tf_tree出现错误的问题

    ubuntu下安装anconda3后启动rqt tf tree会报错 xff0c 信息为 xff1a 原因是安装rospy使用的是python2 但是anconda会把系统的python设置成python3 做法是在不改变anconda安装
  • 上层应用开发是否真的没有底层开发有前途?

    首先明确什么是底层开发 xff0c 这个界限很难划分 xff0c 有人说搞音视频底层编解码就是底层了 xff0c 但是我们看来不是这样 xff0c 下面还有rom中音视频模块 xff0c 再下面还有driver xff0c 最后到物理硬件
  • python http的请求和响应

    span class token triple quoted string string 34 34 34 http请求 请求行和空行是必须要有的 xff0c 请求体和请求头可以没有 请求格式 xff1a 请求行 xff0c 请求头 xff
  • ROS学习篇第(六)篇:通信

    目录 串口通信 ros serial 包的使用ROS分布式多机通信 ssh的使用 xff11 目的2 关于SSR3 实现4 问题 串口通信 ros serial 包的使用 下载 span class token function sudo
  • 小觅双目立体避障模组新品发布,发力AGV物流领域

    2019年9月17日 xff0c 第二十一届中国国际工业博览会 xff0c 在上海国家会展中心正式拉开帷幕 以 立体视觉技术提供商 身份参展本届工博会的MYNTAI小觅智能在展会现场发布了旗下首款针对AGV量身定制的小觅双目立体避障模组 2
  • 小觅双目摄像头深度高精版发布,精度可达毫米级

    今天 xff0c 第二十一届中国国际工业博览会 xff0c 在上海国家会展中心正式拉开帷幕 以 立体视觉技术提供商 身份参展本届工博会的MYNTAI小觅智能 xff0c 携其小觅深度摄像头旗下深度系列新品小觅双目摄像头深度高精版惊喜亮相 自
  • AGV搬运机器人「眼睛」的未来:3D视觉导航方案

    搬运机器人是可以进行自动化搬运作业的工业机器人 xff0c 也就是人们常提到的AGV 自动引导车 中的一个主流大类 随着工厂自动化 计算机集成制造系统技术逐步发展 xff0c 以及柔性制造系统 自动化立体仓库的广泛应用 xff0c AGV搬
  • 小觅双目摄像头标准版视觉惯性 SLAM DEMO

    说到 vins xff0c 就很难不让人想起另一个通过视觉与 imu 融合的经典 OKVIS 它是由 Stefan Leutenegge 等人提出的基于双目 43 惯导的视觉里程计 xff0c 属于 VIO Visual Inertial
  • 小觅智能 | OKVIS 学习笔记

    上一期的视觉里程计 xff0c 让我们想到了 OKVIS xff0c 知乎上的讨论也比较少 xff0c 小觅智能来分享一下 OKVIS 基本介绍 它是由 Stefan Leutenegge 等人提出的基于双目 43 惯导的视觉里程计 xff
  • 小觅双目摄像头标准彩色版发布 为移动机器人视觉导航避障优化设计

    2019年1月15日 xff0c 小觅智能发布了其双目深度相机系列旗下全新产品小觅双目摄像头标准彩色版 xff08 简称标准彩色版 xff0c 下同 xff09 小觅双目摄像头 标准彩色版 xff08 MYNT EYE S Color xf
  • Vins-Fusion 学习笔记

    VINS Fusion 基本介绍 VINS Fusion 是继 VINS Mono 和 VINS Mobile xff08 单目视觉惯导 SLAM 方案 xff09 后 xff0c 香港科技大学沈劭劼老师开源的双目视觉惯导 SLAM 方案
  • 我是如何通过阿里面试的?

    笔者参加18年阿里春招 xff0c 有幸最终拿到阿里offer xff0c base杭州 xff0c 岗位客户端开发 一直忙于其他事情 xff0c 拿到意向已经过去十多天 xff0c 在此分享一些关于面试的干货 xff0c 攒一波RP xf
  • 运行msckf_vio

    MSCKF vio是一种基于多状态约束卡尔曼滤波器的双目视觉里程计 其中多状态约束是指将多帧图像的相机位姿加入卡尔曼状态向量中 xff0c 在进行卡尔曼增益之前通过多帧图像之间的约束进行最小二乘优化来估计特征点的空间位置 xff0c 然后根
  • 建图 | SVO 论文与代码分析分讲

    建图 xff08 深度滤波器 xff09 VO 把像素的深度误差模型看做概率分布 xff0c 使用 高斯 均匀混合分布的逆深度 xff08 深度值服从高斯分布 xff0c 局外点的概率服从 Beta 分布 xff09 xff0c 称为 深度
  • 机房黑科技:京东数科机房巡检机器人

    6月11日 xff0c 第五届CES Asia亚洲消费电子展在上海正式开幕 京东数字科技携旗下多款机器人产品参展 xff0c 并正式发布了多款全新的智能机器人 其中 xff0c 室内运送机器人可以自主乘坐电梯 xff0c 并能自动导航 避障
  • AI深度 | 3D人脸识别和双目结构光惯导

    文 纽豪斯 发布 AI智道 一文看尽双目摄像 结构光 ToF和激光雷达技术 xff1b 一文深入了解小觅智能 奥比中光 华捷艾米 的卢深视 Pico和镭神智能 xff1b AI赋能2大趋势 4大核心技术 前言 纽豪斯刚刚完成 AI深度 xf

随机推荐